下面显示"0"
了Javascript中的false:
>>> "0" == false
true
>>> false == "0"
true
那么,为什么要打印以下内容"ha"
?
>>> if ("0") console.log("ha")
ha
'0'==false
但「0」不是假值(是的Java语言可能很怪异)
==
,它们永远不会转换为布尔值,因此不适用。(转换规则似乎倾向于转换为数字。)
下面显示"0"
了Javascript中的false:
>>> "0" == false
true
>>> false == "0"
true
那么,为什么要打印以下内容"ha"
?
>>> if ("0") console.log("ha")
ha
'0'==false
但「0」不是假值(是的Java语言可能很怪异)
==
,它们永远不会转换为布尔值,因此不适用。(转换规则似乎倾向于转换为数字。)
Answers:
原因是因为当您显式这样做时"0" == false
,双方都将转换为数字,然后执行比较。
当您执行以下操作:时if ("0") console.log("ha")
,正在测试字符串值。任何非空字符串为true
,而空字符串为false
。
等于(==)
如果两个操作数的类型不同,则JavaScript会转换操作数,然后进行严格比较。如果操作数是数字或布尔值,则如果可能,将操作数转换为数字;否则,操作数将转换为数字。否则,如果其中一个操作数是一个字符串,则将另一个操作数转换为字符串(如果可能)。如果两个操作数都是对象,则JavaScript将比较内部引用,当操作数引用内存中的同一对象时,内部引用是相等的。
(从 比较运算符在Mozilla开发者网络)
NaN
虽然。我的意思是,typeof NaN // number
但是NaN === NaN // false
,嗯...
NaN
,因此当您比较两个NaN时,它们具有不同的值(我想)。在这里阅读第一句话。
==
还是===
运营商的[]
,{}
,[[]]
,[0]
和[1]
值不计算为true。我的意思是[] == []
和[] === []
也是假的。
根据规范。
12.5 if语句 ..... 2.如果ToBoolean(GetValue(exprRef))为true,则 一个。返回评估第一条陈述的结果。 3.其他 ....
根据规范,ToBoolean是
根据表11,抽象操作ToBoolean将其参数转换为Boolean类型的值:
该表说明了有关字符串的信息:
如果参数为空String(长度为零),则结果为false;否则,结果为false。否则结果为真
现在,解释一下为什么"0" == false
您应该阅读均等运算符,该运算符声明其从抽象操作获取的值GetValue(lref)
与右侧的相同。
将该相关部分描述为:
如果是IsPropertyReference(V),则 一个。如果HasPrimitiveBase(V)为false,则让get为base的[[Get]]内部方法,否则让get 是下面定义的特殊[[Get]]内部方法。 b。返回使用base作为此值调用get内部方法并传递的结果 参数的GetReferencedName(V)
换句话说,字符串具有原始基数,该基数会回调内部的get方法并最终看起来为false。
如果要使用GetValue操作use评估事物==
,如果要使用ToBoolean
,use ===
(也称为“严格”相等运算符)来评估事物
"a string has a primitive base, which calls back the internal get method and ends up looking false"
所有的字符串都是这样吗?
Section 8.12.3: [[Get]] (P)
描述了它的工作方式。仅在字符串为0的情况下才是正确的,因为这样做会进行一系列其他内部调用,最终导致GetOwnProperty
“ whatever”是数据属性,然后返回该值。这就是为什么“ 0”为假,而“ blah”为真的原因。查阅Douglas Crockford在Yahoo开发人员剧院上的一些视频,他描述了JavaScript中的“真实性”,比我复杂得多。如果您理解“真实”和“虚假”的含义,您将立即理解波宾斯的回答。
您在引号周围将0
其设置为字符串,该字符串被评估为true。
删除引号,它应该工作。
if (0) console.log("ha")
这完全是由于ECMA规范... "0" == false
由于此处http://ecma262-5.com/ELS5_HTML.htm#Section_11.9.3指定的规则...并且if ('0')
由于此处此处指定的规则而计算为true http:/ /ecma262-5.com/ELS5_HTML.htm#Section_12.5
==相等运算符在将参数转换为数字后对其求值。 因此,将字符串零“ 0”转换为Number数据类型,将布尔值false转换为Number 0 。
"0" == false // true
同样适用于`
false == "0" //true
===严格相等性检查会评估原始数据类型的参数
"0" === false // false, because "0" is a string and false is boolean
同样适用于
false === "0" // false
在
if("0") console.log("ha");
字符串“ 0”不与任何参数进行比较,并且字符串是真实值,直到或除非将其与任何参数进行比较。就像
if(true) console.log("ha");
但
if (0) console.log("ha"); // empty console line, because 0 is false
`
if (x)
使用JavaScript的内部toBoolean强制x(http://es5.github.com/#x9.2)
x == false
使用内部toNumber强制(http://es5.github.com/#x9.3)或对象的toPrimitive强制双方(http://es5.github.com/#x9.1)
有关详细信息,请参见http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/
"0"
是一个字符串,并且由于它不是空的,因此被评估为true。