if([] == false) alert('empty array is false');
alert(+[]) // alert 0
if([]) alert('empty array is true');
他们都会发出警报
if([] == false) alert('empty array is false');
alert(+[]) // alert 0
if([]) alert('empty array is true');
他们都会发出警报
这是因为==
(平等)运算符的类型强制。
一个空数组被认为是真实的(就像一个空对象一样),因此调用了第二个警报。
但是,如果您使用([] == false)
,则您的数组将被强制转换为它的字符串表示*,""
这被认为是一个虚假值,这使得条件为真,从而也触发了第一个警报。
如果你想避免类型强制,你必须使用===
(identity) 运算符,这是首选的并且由著名的Douglas Crockford推广的方式在 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 !
==
由于 bfavarettos 答案中提到的奇怪规则,这向您展示了比较的真正“力量” 。
这里的两个当前答案都是正确的,但我想根据语言规范添加更详细的解释。明显矛盾的结果的原因是if
陈述和相等比较的评估方式不同。
在if(expression)
语句的情况下,表达式被求值,然后转换为布尔类型(第 12.5 节)。数组是对象,当一个对象转换为布尔值时,结果总是true
(第 9.2 节)。
平等比较==
遵循一组不同的规则,详见第 11.9.3 节。比较可能需要多次类型转换,直到两个操作数都是相同的类型。操作数的顺序也很重要。根据该算法,我们可以看到比较[] == false
实际上是一个四步操作:
涉及布尔值,因此首先将其转换为数字(算法的第 7 步)。所以它变成:
[] == 0
然后将数组转换为其原始值(参见第 9.1节和第 8.12.8 节),并变为空字符串(步骤 9)。所以:
"" == 0
将字符串与数字进行比较时,首先将字符串转换为数字(第 5 步,遵循第 9.3.1 节中描述的规则):
0 == 0
true
according to step 1.c.iii.true
将值评估为布尔值与将其与or进行比较是有区别的false
。
使用==
运算符时,将转换值以使类型对应。[]
转换为空字符串的值""
,然后将其转换为布尔值false
,因此[] == false
变为真。
评估[]
为布尔值将返回true
,因为它不是“假”值,即0
、false
、null
、或。""
NaN
undefined