在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中的比较运算符)

显示问题的表格:

如果陈述真实

和== 在javascript中所有对象类型的真实比较

故事的道德使用=== 严格平等,表现出理智

表生成功劳: 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.3if ('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/