我在控制台中乱七八糟,看到以下内容:
>>> []
[]
>>> Array.prototype
[]
>>> [] == Array.prototype
false
>>> [] === Array.prototype
false
谁能解释这种行为?(听起来很适合 wtfjs)
我在控制台中乱七八糟,看到以下内容:
>>> []
[]
>>> Array.prototype
[]
>>> [] == Array.prototype
false
>>> [] === Array.prototype
false
谁能解释这种行为?(听起来很适合 wtfjs)
在 Javascript 中,数组上的 == 是指针相等,即仅当两个数组是同一个对象时才为真。如果数组不是指针相等,那么存储到一个不会影响另一个。
>>> typeof [] == typeof Array.prototype
true
本质上,这是Raph Levien 答案的延伸,但我无法将其放在评论中。
我认为注意到这一点很有启发性
[] == [] || [] === [] //outputs false
因此,事实是
[] == Array.prototype || [] === Array.prototype //outputs false
成为预期。阅读MDN 比较运算符可以解释为什么所有四种情况都评估为假:
- 如果两个对象引用同一个对象,则它们是严格相等的。
相等 (==) - 如果两个操作数的类型不同,JavaScript 会转换操作数,然后应用严格比较。如果任一操作数是数字或布尔值,则尽可能将操作数转换为数字;否则,如果任一操作数是字符串,则尽可能将另一个操作数转换为字符串。
严格相等 (===) - 如果操作数严格相等(见上文)且没有类型转换,则返回 true。
js> []
[]
js> Array.prototype
[]
js> [].toString == Array.prototype.toString
true
js> [].toString === Array.prototype.toString
true
也就是说对象的toString方法是相同的。当然,对于 Array.prototype.toString() (这实际上是第二行调用的内容), toString 对象的 this 对象不包含类似数组的属性,因此给出[]
.