为什么在javascript中验证([])而[]==false?
他们都会发出警报为什么在javascript中验证([])而[]==false?,javascript,boolean,Javascript,Boolean,他们都会发出警报 这是因为==(相等)运算符的类型强制 空数组被认为是真实的(就像空对象一样),因此调用第二个警报 但是,如果使用([]==false),数组将强制为其字符串表示形式*,即“”,然后将其视为,这将使条件为真,从而触发第一个警报 如果要避免类型强制,必须使用==(identity)操作符,这是javascript中比较首选的、著名的提升方式 你可以在这本书里读到更多关于这件事的内容 *(Object.prototype.toString被调用) 编辑: JS比较的乐趣: if([]
这是因为
==
(相等)运算符的类型强制
空数组被认为是真实的(就像空对象一样),因此调用第二个警报
但是,如果使用([]==false)
,数组将强制为其字符串表示形式*,即“”
,然后将其视为,这将使条件为真,从而触发第一个警报
如果要避免类型强制,必须使用==
(identity)操作符,这是javascript中比较首选的、著名的提升方式
你可以在这本书里读到更多关于这件事的内容
*(Object.prototype.toString
被调用)
编辑:
JS比较的乐趣:
if([] == false) alert('empty array is false');
alert(+[]) // alert 0
if([]) alert('empty array is true');
这显示了与
==
进行比较的真正“力量”,这是由于bfavarettos答案中提到的奇怪规则。将值作为布尔值进行计算与将其与true
或false
进行比较是有区别的
当使用==
运算符时,将转换值以使类型对应。将[]
值转换为空字符串”“
,然后将其转换为布尔值,则[]==false
变为真
将
[]
作为布尔值进行计算将返回true
,因为它不是一个“假”值,即0
,false
,null
,“
,NaN
或undefined
这两个当前的答案都是正确的,但我想在前面的基础上添加一个更详细的解释。产生明显矛盾结果的原因是if
语句和平等性比较的评估不同
对于if(expression)
语句,将对表达式求值,然后将其转换为布尔类型()。数组是对象,当对象转换为布尔值时,结果总是true
()
与==
的相等性比较遵循一组不同的规则,详见。比较可能需要多次类型转换,直到两个操作数的类型相同为止。操作数的顺序也很重要。根据该算法,我们可以看到比较[]==false
实际上是一个四步操作:
NaN == false // false
NaN == true // also false
NaN == NaN // false
if(NaN) // false
if(!NaN) // true
0 == '0' // true
'' == 0 // true
'' == '0' // false !
true
似乎是某种奇怪的类型强制在
=
中进行。如果您尝试强制转换布尔值,如!![]
如果你得到true
,如果你像[]==
中那样使用[]==false
操作符,那么它不会发出任何警报。document.write(“+[].toString()+”)更准确地说,对象.prototype.toString
在数组实例上被调用,结果是”
(对于有条件的情况)。@jAndy这是真的,我想保持简单,但很好,你添加了评论;)@嗯,我不是以英语为母语的人,所以这可能不太合理,我只想说的是,你可能需要自己评估他非常有说服力的观点。我相信这是一个toString,评估为“”而不是“”0@mplungjan:是的,我刚刚添加了所有falsy值,并将“e.g.”更改为“I.e.”:)是的,我看到了,并删除了我的评论,但我认为您仍然对第一条语句中的0+1有问题,因为您做作业,但是请注意,一些转换仍然存在问题,如“”
到0
,这很难解释,但却是这些奇怪现象的关键点,以及等式运算符缺少传递性,如'
、0
和'0'
。谢谢@Christoph。添加了到第9.3.1节的链接,其中解释了“->0
。我所理解的是,在中如果([]==false)
和错误
被转换为一个数字,所以+[]=0和+false=0并且相等,在中如果([])
[]
被转换为对象,该对象被转换为布尔值,且对象始终为真。“是这样吗?”乔纳森·安德姆说。几乎。在if([]==false)
中,false
直接转换为0
<首先将代码>[]
转换为字符串(类似于[]+”“/”
),然后将“
转换为0
。在中,如果([])
:数组是对象,因此数组不会转换为对象,它已经是一个对象了。
[] == 0
"" == 0
0 == 0