如果[]是[]而Array.prototype是[]为什么不([] == Array.prototype)

时间:2011-01-18 04:27:33

标签: javascript prototype type-conversion type-coercion

我在控制台搞乱了,看到了以下内容:

>>> []
[]
>>> Array.prototype
[]
>>> [] == Array.prototype
false
>>> [] === Array.prototype
false

任何人都可以解释这种行为吗? (听起来像wtfjs的一个很好的候选人)

4 个答案:

答案 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对象不包含类似于数组的属性,因此给出了[]