我知道JavaScript在类型之间的比较中有很多疯狂的结果,尽管我不完全理解为什么。今天遇到了这个。
为什么
"" == [null]
在JavaScript中求值为true
?
更多的Javascript等式娱乐,感谢@Qantas:
发布于 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()
:
> [null].toString()
""
现在你就知道了。
编辑:为什么[null].toString()
是空字符串?因为数组实例上的.toString()
操作始终只调用.join()
,这将始终为null
和undefined
值生成一个空字符串。因此,一个null
的数组最终只是一个空字符串。
发布于 2014-08-27 23:52:39
它是根据Javascript神秘的type-conversion规则编写的。规则#8:
如果类型(X)是字符串或数字,并且类型(Y)是Object,则返回比较x == ToPrimitive(y)的结果。
因此,比较的是x = ""
和使用ToPrimitive
转换为字符串的y = [null]
。转换一个包含一个空元素的数组将产生一个空字符串(因为Array.toString()
返回一个逗号分隔的值列表),因此它们的计算结果为相等。
发布于 2014-08-27 23:50:55
为什么
"" == [null]
的计算结果为true?
因为您正在使用non-strict equality operator ==
比较数组和字符串,所以在比较它们之前,它会尝试将值强制转换为相同的类型。
具体发生的情况是:
.toString()
方法会被调用(正如其他答案中详细解释的那样),这相当于在只包含undefined
或null
值的单元素数组中调用.toString()
第三步是意想不到的([null]+"" != null+""
),如果它真的将其转换为字符串,则结果将为"null"
,而您的相等为false。
https://stackoverflow.com/questions/25531424
复制相似问题