如下所示,Javascript中的"0"为false:
>>> "0" == false
true
>>> false == "0"
true
那么下面为什么打印“哈”呢?
>>> if ("0") console.log("ha")
ha
如下所示,Javascript中的"0"为false:
>>> "0" == false
true
>>> false == "0"
true
那么下面为什么打印“哈”呢?
>>> if ("0") console.log("ha")
ha
当前回答
这是按规格的。
12.5 The if Statement ..... 2. If ToBoolean(GetValue(exprRef)) is true, then a. Return the result of evaluating the first Statement. 3. Else, ....
根据规范,ToBoolean是
抽象操作ToBoolean根据表11将其参数转换为Boolean类型的值:
这个表格是这样描述字符串的:
如果参数为空String(其长度为零),则结果为假; 否则结果为真
现在,为了解释为什么"0" == false,您应该读取相等运算符,它表示它从抽象操作GetValue(lref)中获得其值,与右侧的相同。
将相关部分描述为:
if IsPropertyReference(V), then a. If HasPrimitiveBase(V) is false, then let get be the [[Get]] internal method of base, otherwise let get be the special [[Get]] internal method defined below. b. Return the result of calling the get internal method using base as its this value, and passing GetReferencedName(V) for the argument
或者换句话说,字符串有一个基元,它会回调内部的get方法,结果看起来是false。
如果你想用GetValue运算来求值,请使用==,如果你想用ToBoolean运算,请使用===(也称为“严格”相等运算符)
其他回答
显示问题的表格:
和= =
这个故事的寓意使用===
表生成credit: https://github.com/dorey/JavaScript-Equality-Table
我也有同样的问题,我找到了一个可行的解决方案如下:
原因是
if (0) means false, if (-1, or any other number than 0) means true. following value are not truthy, null, undefined, 0, ""empty string, false, NaN
永远不要使用id之类的数字类型
if (id) {}
对于可能值为0的id类型,我们不能使用if (id){},因为if(0)将意味着false,无效,这是我们想要的,它意味着有效为true id数。
所以对于id类型,我们必须使用以下方法:
if ((Id !== undefined) && (Id !== null) && (Id !== "")){
} else {
}
对于其他字符串类型,我们可以使用if (string){},因为null, undefined,空字符串都将计算为false,这是正确的。
if (string_type_variable) { }
在PHP中,字符串“0”是假的(false-when-used-in-boolean-context)。在JavaScript中,所有非空字符串都是真值。
技巧是==针对布尔值并不在布尔上下文中求值,它转换为数字,在字符串的情况下是通过解析为十进制来完成的。所以你得到0而不是truthiness boolean true。
这是一个非常糟糕的语言设计,这也是我们尽量不使用不幸的==操作符的原因之一。请使用===代替。
The "if" expression tests for truthiness, while the double-equal tests for type-independent equivalency. A string is always truthy, as others here have pointed out. If the double-equal were testing both of its operands for truthiness and then comparing the results, then you'd get the outcome you were intuitively assuming, i.e. ("0" == true) === true. As Doug Crockford says in his excellent JavaScript: the Good Parts, "the rules by which [== coerces the types of its operands] are complicated and unmemorable.... The lack of transitivity is alarming." It suffices to say that one of the operands is type-coerced to match the other, and that "0" ends up being interpreted as a numeric zero, which is in turn equivalent to false when coerced to boolean (or false is equivalent to zero when coerced to a number).
==相等运算符在将参数转换为数字后求值。 因此字符串0" 0"被转换为数字数据类型,布尔值false被转换为数字0。 所以
"0" == false // true
同样适用于'
False == "0" //true
===严格的相等性检查使用原始数据类型计算参数
"0" === false // false,因为"0"是字符串,false是布尔值
同样适用于
False === "0" // False
In
if(“0”) console.log(“ha”);
String "0"不与任何参数进行比较,并且String在与任何参数进行比较之前都是真值。 就像
if (true) console.log (" ha ");
But
If (0) console.log("ha");//空控制台行,因为0是假的
`