为什么JavaScript中使用“== == [null]”?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

我知道JavaScript有许多疯狂的结果和类型之间的比较,但我不完全明白为什么。今天遇到这个。

为什么

"" == [null]

评估到trueJavaScript?

提问于
用户回答回答于

“抽象平等比较算法”有很多地方,但这里的重要的一条是这样的:

如果Type(x)是String或Number而Type(y)是Object,则返回比较结果x == ToPrimitive(y)。

(也有镜像。)因此,因为""是一个字符串并且[null]是一个对象,所以我们必须先[null]通过调用转换为一个字符串ToPrimitive([null])。当要求将Object实例转换为原始值时,这是一个内部操作,如下所述:

返回对象的默认值。通过调用对象的[[DefaultValue]]内部方法来检索对象的默认值,并传递可选的提示PreferredType。本规范针对8.12.8中的所有本地ECMAScript对象定义[[DefaultValue]]内部方法的行为。

现在,[[DefaultValue]]内部操作将调用.toString()该对象并返回该值。试用[null].toString()您的浏览器控制台:

> [null].toString()
""

为什么是[null].toString()一个空字符串?因为.toString()对Array实例的操作总是只是调用.join(),并且这总是为空值nullundefined值产生一个空字符串。因此,一个数组null最终只是一个空字符串。

用户回答回答于

这是根据JavaScript 的神秘类型转换规则。规则#8:

如果Type(x)是String或Number而Type(y)是Object,则返回比较结果x == ToPrimitive(y)。

所以比较是在两者之间x = ""进行y = [null]转换并转换为一个字符串ToPrimitive。用一个空元素转换数组会导致一个空字符串(因为Array.toString()返回逗号分隔的值列表),因此它们的计算结果相同。

扫码关注云+社区