在JavaScript中,为什么“0”等于false,但是如果通过“if”testing,它本身不是错误的?
以下显示在Javascript中"0"
为false:
>>> "0" == false true >>> false == "0" true
那么为什么下面打印"ha"
?
>>> if ("0") console.log("ha") ha
原因是当你明确地做"0" == false
,双方都被转换成数字, 然后进行比较。
当你这样做: if ("0") console.log("ha")
,string值正在testing。 任何非空string都是true
,而空string是false
。
等于(==)
如果两个操作数的types不同 ,JavaScript会转换操作数,然后进行严格的比较。 如果任一操作数是一个数字或一个布尔值 ,操作数将尽可能转换为数字。 否则,如果任一操作数是一个string ,则另一个操作数将被转换为一个string(如果可能)。 如果两个操作数都是对象 ,那么当操作数引用内存中的同一对象时,JavaScript比较内部引用。
(来自Mozilla开发人员networking中的比较运算符)
显示问题的表格:
和==
故事的道德使用===
表生成功劳: https : //github.com/dorey/JavaScript-Equality-Table
这是根据规范。
12.5 if语句 ..... 2.如果ToBoolean(GetValue(exprRef))为真,那么 一个。 返回评估第一个语句的结果。 3.另外, ....
根据规范,ToBoolean是
抽象操作ToBoolean根据表11将其参数转换为Booleantypes的值:
那桌子就是这样说的:
如果参数是空string(长度为零),则结果为false。 否则结果是真的
现在,为了解释为什么"0" == false
你应该读取相等运算符,它说明它从抽象操作GetValue(lref)
匹配右边的值。
其中将相关部分描述为:
如果IsPropertyReference(V)那么 一个。 如果HasPrimitiveBase(V)是false,那么让它成为base的[[Get]]内部方法,否则让get 成为下面定义的特殊[[Get]]内部方法。 湾 返callback用使用base的get内部方法作为其值的结果,并传递 GetReferencedName(V)作为参数
换句话说,一个string有一个基本的基础,它callback内部的get方法,最终看起来是错误的。
如果要使用GetValue操作使用==
评估事物,如果要使用ToBoolean
进行求值,请使用===
(也称为“严格”等号运算符)
这是PHP的string"0"
是假的(布尔上下文中使用时为false)。 在JavaScript中,所有非空string都是真的。
诀窍是==
对布尔值不计算在布尔上下文中,它转换为数字,并在string的情况下通过parsing为十进制。 所以你得到数字0
而不是真实布尔true
。
这是一个非常糟糕的语言devise,这是我们试图不使用不幸==
运算符的原因之一。 改用===
。
// 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.
你在0
附近的引号使它成为一个string,被评估为真。
删除引号,它应该工作。
if (0) console.log("ha")
这完全是因为ECMA规范… "0" == false
因为这里指定的规则http://ecma262-5.com/ELS5_HTML.htm#Section_11.9.3 … if ('0')
由于http://ecma262-5.com/ELS5_HTML.htm#Section_12.5中指定的规则而评估为真;
“如果”expression式testing真实性,而types独立等价性的双等同testing。 正如其他人在这里指出的那样,string总是真的很好。 如果双等号testing其两个操作数的真实性,然后比较结果,那么你会得到你直观地假设的结果,即("0" == true) === true
。 正如道格·克罗克福德(Doug Crockford)在其杰出的JavaScript中所说的那样:“好的部分 ”( Good Parts) ,“强制执行其操作types的规则”是复杂的和不可计量的……缺乏传递性是令人震惊的。 只要说其中一个操作数被强制types匹配另一个操作数,并且“0”最终被解释为数字零,当被强制为布尔值时(或者false等于零当强迫到一个数字)。
if (x)
强制x使用JavaScript的内部toBoolean(http://es5.github.com/#x9.2);
x == false
强制双方使用内部toNumber强制(http://es5.github.com/#x9.3)或原创的对象(http://es5.github.com/#x9.1);
有关详细信息,请参阅http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/