我知道JavaScript在类型之间进行比较有很多疯狂的结果,但我并不完全理解为什么。今天碰到了这个。
为什么
"" == [null]
在JavaScript中评估为true
?
更多Javascript平等娱乐,感谢@Qantas:
答案 0 :(得分:76)
"Abstract Equality Comparison Algorithm"有很多部分,但重要的是:
如果Type( x )是String或Number而Type( y )是Object, 返回比较结果 x == ToPrimitive( y )。
(也有镜像也是如此。)因此,因为""
是一个字符串而[null]
是一个对象,所以我们必须先将[null]
转换为一个字符串致电ToPrimitive([null])
。当要求将Object实例转换为原始值时,这是一个如下所述的内部操作:
返回Object的默认值。通过调用对象的[[DefaultValue]]内部方法,传递可选提示 PreferredType 来检索对象的默认值。 [[DefaultValue]]内部方法的行为由本规范为8.12.8中的所有本机ECMAScript对象定义。
现在,[[DefaultValue]]内部操作将调用对象上的.toString()
并返回该值。在浏览器控制台中尝试[null].toString()
:
> [null].toString()
""
你有它。
编辑:为什么[null].toString()
是一个空字符串?因为对Array实例的.toString()
操作始终只调用.join()
,并且总是会产生null
和undefined
值的空字符串。因此,一个null
的数组最终只是一个空字符串。
答案 1 :(得分:17)
根据Javascript的神秘type-conversion规则。规则#8:
如果Type(x)是String或Number而Type(y)是Object,则返回比较结果x == ToPrimitive(y)。
因此,使用x = ""
将y = [null]
和ToPrimitive
之间的比较转换为字符串。使用一个null元素转换数组会导致一个空字符串(因为Array.toString()
返回一个以逗号分隔的值列表),因此它们的计算结果相等。
答案 2 :(得分:12)
为什么
"" == [null]
评估为真?
因为您正在使用non-strict equality operator ==
将数组与字符串进行比较,所以它会在比较之前尝试将值转换为相同类型。
详细情况是:
.toString()
方法(正如其他答案详细解释的那样),这相当于调用.join()
:undefined
或null
值returns the empty string 第三步是意外的一个([null]+"" != null+""
),如果它实际上将其强制转换为字符串,结果将是"null"
并且您的等式为假。
答案 3 :(得分:2)
让我们看看规范并完成每个步骤
通过Abstract Equality Comparison Algorithm (§11.9.3):
typeof ""; // string
和typeof [null]; // object
因此不适用null
或undefined
都不适用ToPrimitive([null])
§9.1 ToPrimitive说我们需要解决[[DefaultValue]]
(§8.12.8),其中第1和第2点说你是否可以.toString
并且它给出了一个字符串,返回那个,所以
[null].toString(); // ""
因此,我们现在通过抽象等值比较算法第1点执行"" == ""
true
的比较.d。
如果
Type(x)
是字符串,那么如果true
和x
完全相同的字符序列(相同的长度和相同的字符串),则返回y
相应位置的字符)。否则,请返回false
。
答案 4 :(得分:1)
JavaScript是弱类型的;您可以使用以下方法获得错误结果:
"" === [null]
答案 5 :(得分:-1)
值null是一个JavaScript文字,表示null或" empty"值,即不存在对象值。它是JavaScript的原始值之一。
值null是一个文字(不是像undefined那样的全局对象的属性)。在API中,通常在可以预期对象但没有对象相关的位置检索null。检查null或undefined时要注意相等(==)和identity(===)运算符之间的差异(使用前者执行类型转换)。
typeof null // object (bug in ECMAScript, should be null)
typeof undefined // undefined
null === undefined // false
null == undefined // true