我知道JavaScript在类型比较方面有很多不可思议的结果,尽管我不完全理解为什么。今天遇到了这个。
为什么
"" == [null]
在JavaScript中如何评估为true
?
更多的JavaScript相等性趣味,感谢@Qantas:
我知道JavaScript在类型比较方面有很多不可思议的结果,尽管我不完全理解为什么。今天遇到了这个。
为什么
"" == [null]
在JavaScript中如何评估为true
?
更多的JavaScript相等性趣味,感谢@Qantas:
"抽象相等比较算法"包含许多部分,但这里重要的是:
如果 Type(x) 是 String 或 Number 并且 Type(y) 是 Object,则返回比较结果 x == ToPrimitive(y)。
(也有一个镜像版本)。因此,由于 ""
是字符串而 [null]
是对象,我们必须先通过调用 ToPrimitive([null])
将 [null]
转换为字符串。当它被要求将一个对象实例转换为原始值时,这是一个内部操作,描述如下:
现在,[[DefaultValue]] 内部操作将调用对象的返回对象的默认值。通过调用对象的 [[DefaultValue]] 内部方法并传递可选提示 PreferredType 来检索对象的默认值。对于所有本地 ECMAScript 对象,[[DefaultValue]] 内部方法的行为在 8.12.8 中由本规范定义。
.toString()
方法并返回该值。在浏览器控制台中尝试使用 [null].toString()
:> [null].toString()
""
这就是它的原理。
编辑:为什么[null].toString()
会变成空字符串呢?因为对于数组实例,.toString()
操作总是调用.join()
,而对于null
和undefined
值,.join()
总是返回空字符串。因此,一个只包含一个null
的数组最终会变成一个单独的空字符串。
[null].toString()
不返回"null"
? - IzkataArray.prototype.toString()
方法返回调用该数组的this.join()
的结果,而.join()
方法将null
和undefined
条目呈现为空字符串。因此,具有一个null
条目的数组呈现为空字符串。 - Pointy==
表示JavaScript中的===
,所以需要通过艰苦的学习才能掌握... ;) - Scott Stafford因此,比较的是将如果x的类型是字符串或数字,y的类型是对象,则返回比较x == ToPrimitive(y)的结果。
x = ""
和y = [null]
使用ToPrimitive
转换为字符串后的结果。将只有一个null元素的数组转换为字符串会得到一个空字符串(因为Array.toString()
返回逗号分隔的值列表),因此它们相等。为什么
"" == [null]
的结果是 true?
因为你在使用非严格相等运算符 ==
比较一个字符串和一个数组,所以它会在比较之前尝试将值转换为相同的类型。
具体来说,会发生以下情况:
.toString()
方法会被调用(正如其他答案中详细解释的那样),这相当于调用 .join()
:undefined
或 null
值的单元素数组,返回空字符串[null]+"" != null+""
),如果它实际上将其转换为字符串,结果将会是"null"
,你的相等性将会是假的。typeof ""; // string
和typeof [null]; // object
,因此不适用null
也不是undefined
,因此不适用ToPrimitive([null])
[[DefaultValue]]
(§8.12.8),其中的第1和第2点说如果你可以使用.toString
并且它返回一个字符串,则返回该字符串,因此[null].toString(); // ""
现在我们正在执行比较"" == ""
,根据抽象相等比较算法的第1点d,结果为true
。
如果
Type(x)
是字符串,则如果x
和y
是完全相同的字符序列(长度相同且对应位置上的字符相同),则返回true
。否则,返回false
。
"" === [null]
值 null 是 JavaScript 字面量,表示 null 或“空”值,即没有对象值存在。它是 JavaScript 的原始值之一。
值 null 是字面量(不像 undefined 可以是全局对象的属性)。在 API 中,null 经常在需要对象但没有相关对象时被检索。当检查 null 或 undefined 时,请注意等式(==)和恒等式(===)运算符之间的差异(前者执行类型转换)。
typeof null // object (bug in ECMAScript, should be null)
typeof undefined // undefined
null === undefined // false
null == undefined // true
(string)null
,也就是空字符串。 - scragar===
,并将它们转换为相同的类型。 - Paul S.