繁体   English   中英

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

[英]If [] is [] and Array.prototype is [] why doesn't ([] == Array.prototype)

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

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

谁能解释这种行为? (听起来像wtfjs的一个很好的候选人)

在Javascript中,== on数组是指针相等,即只有两个数组都是同一个对象才为真。 如果数组不是指针相等,那么存储到一个不会影响另一个。

>>> typeof [] == typeof Array.prototype
true

基本上这是Raph Levien答案的延伸,但我无法将其纳入评论。

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

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

因此,事实

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

变得预料。 阅读MDN比较运算符可以解释为什么所有四种情况都评估为false:

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

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

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

js> []
[]
js> Array.prototype
[]
js> [].toString == Array.prototype.toString
true
js> [].toString === Array.prototype.toString
true

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM