我在控制台搞乱了,看到了以下内容:
>>> []
[]
>>> Array.prototype
[]
>>> [] == Array.prototype
false
>>> [] === Array.prototype
false
任何人都可以解释这种行为吗? (听起来像wtfjs的一个很好的候选人)
答案 0 :(得分:8)
在Javascript中,数组上的==是指针相等,即只有两个数组都是同一个对象才为真。如果数组不是指针相等,那么存储到一个不会影响另一个。
答案 1 :(得分:2)
>>> typeof [] == typeof Array.prototype
true
答案 2 :(得分:1)
基本上这是Raph Levien's answer的扩展,但我无法将其纳入评论。
我认为注意到
是很有启发性的[] == [] || [] === [] //outputs false
因此事实
[] == Array.prototype || [] === Array.prototype //outputs false
成为预期。阅读MDN Comparison Operators会得出关于为什么所有四种情况都评估为假的解释:
- 如果两个对象引用相同的对象,则它们严格相等。
Equal(==) - 如果两个操作数的类型不同,JavaScript会转换操作数,然后应用严格比较。如果操作数是数字或布尔值,操作数将尽可能转换为数字;否则,如果任一操作数是一个字符串,则另一个操作数将转换为字符串(如果可能)。
严格相等(===) - 如果操作数严格相等(见上文)且没有类型转换,则返回true。
答案 3 :(得分:0)
js> []
[]
js> Array.prototype
[]
js> [].toString == Array.prototype.toString
true
js> [].toString === Array.prototype.toString
true
也就是说,对象的toString方法是相同的。当然,对于Array.prototype.toString()(实际上是第二行调用的),toString对象的this对象不包含类似于数组的属性,因此给出了[]
。