Jon*_* M. 14 javascript boolean
if([] == false) alert('empty array is false');
alert(+[]) // alert 0
if([]) alert('empty array is true');
Run Code Online (Sandbox Code Playgroud)
他们都将运行警报
Chr*_*oph 18
这是因为==
(相等)运算符的类型强制.
空数组被认为是真实的(就像空对象一样),因此调用第二个警报.
但是,如果使用,则会([] == false)
将数组强制转换为其字符串表示形式*,""
然后将其视为假值,这会使条件成立,从而触发第一个警报.
如果你想避免类型强制,你必须使用===
(标识)运算符,这是首选和着名的道格拉斯克罗克福德推广方式在javascript中进行比较.
您可以在这个详尽的答案中阅读更多关于此事的内容.
*(Object.prototype.toString
被称为)
编辑:与JS比较的乐趣:
NaN == false // false
NaN == true // also false
NaN == NaN // false
if(NaN) // false
if(!NaN) // true
0 == '0' // true
'' == 0 // true
'' == '0' // false !
Run Code Online (Sandbox Code Playgroud)
==
由于bfavarettos答案中提到的奇怪规则,这向您展示了比较的真正"力量" .
bfa*_*tto 18
这里的两个当前答案都是正确的,但我想根据语言规范添加更严格的解释.结果明显矛盾的原因是对if
陈述和平等比较的评价不同.
在if(expression)
语句的情况下,表达式被计算,然后转换为布尔类型(第12.5节).数组是对象,当Object转换为Boolean时,结果总是true
(第9.2节).
平等比较==
遵循不同的规则集,详见第11.9.3节.比较可能需要多次类型转换,直到两个操作数都是相同的类型.操作数的顺序也很重要.根据该算法,我们可以看到比较[] == false
实际上是一个四步操作:
涉及布尔值,因此首先将其转换为数字(算法的第7步).所以它变成:
[] == 0
Run Code Online (Sandbox Code Playgroud)然后将数组转换为其原始值(参见第9.1 节和第8.12.8节),并变为空字符串(步骤9).所以:
"" == 0
Run Code Online (Sandbox Code Playgroud)将String与Number进行比较时,String首先转换为Number(步骤5,遵循第9.3.1节中描述的规则):
0 == 0
Run Code Online (Sandbox Code Playgroud)true
根据步骤1.c.iii 进行评估.