以下显示"0"
在 Javascript中为 false:
>>> "0" == false
true
>>> false == "0"
true
那么为什么会打印以下内容"ha"
呢?
>>> if ("0") console.log("ha")
ha
以下显示"0"
在 Javascript中为 false:
>>> "0" == false
true
>>> false == "0"
true
那么为什么会打印以下内容"ha"
呢?
>>> if ("0") console.log("ha")
ha
原因是因为当你显式执行时"0" == false
,双方都被转换为数字,然后进行比较。
当您执行以下操作时:if ("0") console.log("ha")
,正在测试字符串值。任何非空字符串都是true
,而空字符串是false
。
等于 (==)
如果两个操作数的类型不同,JavaScript 会转换操作数,然后应用严格的比较。如果操作数是数字或布尔值,则尽可能将操作数转换为数字;否则,如果任一操作数是字符串,则另一个操作数在可能的情况下转换为字符串。如果两个操作数都是对象,那么当操作数引用内存中的同一个对象时,JavaScript 会比较内部引用是否相等。
(从比较运算符在Mozilla开发者网络)
这是根据规范。
12.5 if 语句 ..... 2. 如果 ToBoolean(GetValue(exprRef)) 为真,则 一个。返回评估第一个 Statement 的结果。 3. 否则, ....
根据规范,ToBoolean 是
抽象操作 ToBoolean 根据表 11 将其参数转换为 Boolean 类型的值:
那个表格是关于字符串的:
如果参数是空字符串(其长度为零),则结果为假;否则结果为真
现在,解释为什么"0" == false
你应该阅读相等运算符,它声明它从抽象操作GetValue(lref)
中获取其值与右侧的相同。
将这一相关部分描述为:
如果 IsPropertyReference(V),则 一个。如果 HasPrimitiveBase(V) 为 false,则令 get 为 base 的 [[Get]] 内部方法,否则令 get 是下面定义的特殊 [[Get]] 内部方法。 湾 返回以base为this值调用get内部方法的结果,并通过 参数的 GetReferencedName(V)
或者换句话说,一个字符串有一个原始基础,它回调内部的 get 方法并最终看起来是假的。
如果您想使用 GetValue 操作使用来评估事物==
,如果您想使用, 进行评估ToBoolean
,请使用===
(也称为“严格”相等运算符)
PHP 中的字符串"0"
为假(false-when-used-in-boolean-context)。在 JavaScript 中,所有非空字符串都是真值。
诀窍是,==
针对布尔值不会在布尔上下文中进行评估,它会转换为数字,并且在字符串的情况下是通过解析为十进制来完成的。所以你得到 Number0
而不是 truthiness boolean true
。
这是一个非常糟糕的语言设计,也是我们尽量不使用不幸的==
运算符的原因之一。使用===
来代替。
// I usually do this:
x = "0" ;
if (!!+x) console.log('I am true');
else console.log('I am false');
// Essentially converting string to integer and then boolean.