首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么JavaScript中的"“== [null]是真的?

为什么JavaScript中的"“== [null]是真的?
EN

Stack Overflow用户
提问于 2014-08-27 23:39:25
回答 6查看 4.8K关注 0票数 54

我知道JavaScript在类型之间的比较中有很多疯狂的结果,尽管我不完全理解为什么。今天遇到了这个。

为什么

代码语言:javascript
复制
"" == [null]

在JavaScript中求值为true

更多的Javascript等式娱乐,感谢@Qantas:

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2014-08-27 23:54:07

"Abstract Equality Comparison Algorithm"有很多部分,但这里最重要的一点是:

如果类型(X)是字符串或数字,并且类型(Y)是Object,则返回比较x == ToPrimitive(y)的结果。

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

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

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

代码语言:javascript
复制
> [null].toString()
""

现在你就知道了。

编辑:为什么[null].toString()是空字符串?因为数组实例上的.toString()操作始终只调用.join(),这将始终为nullundefined值生成一个空字符串。因此,一个null的数组最终只是一个空字符串。

票数 76
EN

Stack Overflow用户

发布于 2014-08-27 23:52:39

它是根据Javascript神秘的type-conversion规则编写的。规则#8:

如果类型(X)是字符串或数字,并且类型(Y)是Object,则返回比较x == ToPrimitive(y)的结果。

因此,比较的是x = ""和使用ToPrimitive转换为字符串的y = [null]。转换一个包含一个空元素的数组将产生一个空字符串(因为Array.toString()返回一个逗号分隔的值列表),因此它们的计算结果为相等。

票数 17
EN

Stack Overflow用户

发布于 2014-08-27 23:50:55

为什么"" == [null]的计算结果为true?

因为您正在使用non-strict equality operator ==比较数组和字符串,所以在比较它们之前,它会尝试将值强制转换为相同的类型。

具体发生的情况是:

  1. 将字符串与对象进行比较,因此对象会转换为字符串:
  2. 当数组转换为原始值时,它的.toString()方法会被调用(正如其他答案中详细解释的那样),这相当于在只包含undefinednull值的单元素数组中调用
  • 等同于空字符串.toString()

第三步是意想不到的([null]+"" != null+""),如果它真的将其转换为字符串,则结果将为"null",而您的相等为false。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25531424

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档