我知道JavaScript在类型之间进行比较时会有很多疯狂的结果,但我并不完全理解为什么.今天碰到了这个.
为什么
"" == [null]
Run Code Online (Sandbox Code Playgroud)
true用JavaScript 评估?
更多Javascript平等娱乐,感谢@Qantas:
Poi*_*nty 76
在"抽象平等比较算法"有很多地方,但这里的重要的一条是这样的:
如果Type(x)是String或Number而Type(y)是Object,则返回比较结果x == ToPrimitive(y).
(也有镜像也是如此.)因此,因为""是一个字符串而且[null]是一个对象,我们必须先[null]通过调用转换为字符串ToPrimitive([null]).当要求将Object实例转换为原始值时,这是一个如下所述的内部操作:
返回Object的默认值.通过调用对象的[[DefaultValue]]内部方法,传递可选提示PreferredType来检索对象的默认值.对于8.12.8中的所有本机ECMAScript对象,此规范定义了[[DefaultValue]]内部方法的行为.
现在,[[DefaultValue]]内部操作将调用.toString()该对象并返回该值.尝试[null].toString()使用浏览器控制台:
> [null].toString()
""
Run Code Online (Sandbox Code Playgroud)
你有它.
编辑:为什么是[null].toString()一个空字符串?因为.toString()对Array实例的操作总是只调用.join(),并且总是为null和undefined值生成一个空字符串.因此,一个数组null最终只是一个空字符串.
McG*_*gle 17
这是根据Javascript 的神秘类型转换规则.规则#8:
如果Type(x)是String或Number而Type(y)是Object,则返回比较结果x == ToPrimitive(y).
所以比较是在之间x = ""并使用y = [null]转换为字符串ToPrimitive.使用一个null元素转换数组会导致空字符串(因为Array.toString()返回以逗号分隔的值列表),因此它们的计算结果相等.
Ber*_*rgi 12
为什么
"" == [null]评价为真?
因为您正在使用非严格相等运算符==将数组与字符串进行比较- 所以它会在比较它们之前尝试将值转换为相同类型.
详细情况是:
.toString()方法被调用(正如其他答案所详细解释的),这相当于调用.join():undefined或null值返回空字符串第三步是意外的one([null]+"" != null+""),如果它实际上将其转换为字符串,则结果将是,"null"并且您的等式为false.
| 归档时间: |
|
| 查看次数: |
4620 次 |
| 最近记录: |