4

我在控制台中乱七八糟,看到以下内容:

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

谁能解释这种行为?(听起来很适合 wtfjs)

4

4 回答 4

8

在 Javascript 中,数组上的 == 是指针相等,即仅当两个数组是同一个对象时才为真。如果数组不是指针相等,那么存储到一个不会影响另一个。

于 2011-01-18T04:36:25.913 回答
2
>>> typeof [] == typeof Array.prototype
true
于 2011-01-18T04:40:51.520 回答
1

本质上,这是Raph Levien 答案的延伸,但我无法将其放在评论中。

我认为注意到这一点很有启发性

[] == [] || [] === [] //outputs false

因此,事实是

[] == Array.prototype || [] === Array.prototype //outputs false

成为预期。阅读MDN 比较运算符可以解释为什么所有四种情况都评估为假:

  • 如果两个对象引用同一个对象,则它们是严格相等的。

相等 (==) - 如果两个操作数的类型不同,JavaScript 会转换操作数,然后应用严格比较。如果任一操作数是数字或布尔值,则尽可能将操作数转换为数字;否则,如果任一操作数是字符串,则尽可能将另一个操作数转换为字符串。

严格相等 (===) - 如果操作数严格相等(见上文)且没有类型转换,则返回 true。

于 2011-01-18T06:02:31.863 回答
0
js> []
[]
js> Array.prototype
[]
js> [].toString == Array.prototype.toString
true
js> [].toString === Array.prototype.toString
true

也就是说对象的toString方法是相同的。当然,对于 Array.prototype.toString() (这实际上是第二行调用的内容), toString 对象的 this 对象不包含类似数组的属性,因此给出[].

于 2011-01-18T04:54:32.333 回答