JavaScript:为什么[]==![]?
在JavaScript中,我注意到JavaScript:为什么[]==![]?,javascript,Javascript,在JavaScript中,我注意到[]==![]结果为true 我不明白这个结果。你能解释一下原因吗?[]是一个数组,但是![]是一个布尔值。当您试图用=比较两个不同类型的对象时,应将两个对象转换为可比较的对象(使用ToNumber,请参见11.9.3中的步骤7)。这就是为什么[]==![]生成true,第一个空数组的计算结果为false 比较x==y,其中x和y是值,生成true或false。这样的比较如下所示: 如下: [……] 如果x为null而y未定义,则返回true 如果x未定义且y为
[]==![]
结果为true
我不明白这个结果。你能解释一下原因吗?
[]
是一个数组,但是![]
是一个布尔值。当您试图用=
比较两个不同类型的对象时,应将两个对象转换为可比较的对象(使用ToNumber
,请参见11.9.3中的步骤7)。这就是为什么[]==![]
生成true,第一个空数组的计算结果为false
比较x==y,其中x和y是值,生成true或false。这样的比较如下所示:
如下:
==
,则结果为false,因为这两种类型不同:
比较x===y,其中x和y是值,生成true或false。进行这样的比较
详情如下:
@曾格:我不知道。对我来说,这似乎是一个完全不同的问题。@BoltClock:[]在布尔上下文中是真的,而且![]因此为false,之后代码执行[]==false,结果为true。@AnttiHaapala:这不完全正确-
[1]
在布尔上下文中为true,但![1]
为false,[1]==false
也会产生false。这不是布尔上下文,而是=
算法。@BoltClock我同意@Antti。答案详细描述了[]
和的转换![]
,它回答了这个问题。@zengr:这并不是同一个问题。请详细说明“转化为可比较的对象。这就是为什么[]==![]产生true”。这个答案看起来像没有证据的猜测。回复:编辑:仍然不够。相关部分见第11.9.3节。您可以按照定义的步骤得出正确的结论。@RobW:我注意到了错误并删除了错误的相等运算符。我花了一点时间加载ECMA-262.pdf,我的连接速度很慢。@RobW:谢谢你帮我添加了书签。我还在我的硬盘上保存了一份副本,这应该很容易处理[]=![]
是[]
和之间的抽象相等比较![]
注意,typeof(![])
是boolean
,typeof([])
是对象
。从x==y的文档中,如果类型(y)是布尔值,则返回比较结果x==ToNumber(y)。t编号为![]
也就是说false
是0,所以它归结为[]==0,[]==0
的结果是true
@kidmenot:显然,在周六早上还是太早了。修正了我的答案。