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

Sco*_*ord 54 javascript

我知道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(),并且总是为nullundefined值生成一个空字符串.因此,一个数组null最终只是一个空字符串.

  • @Izkata`Array.prototype.toString()`返回在数组上调用`this.join()`的结果,`.join()`将`null`和`undefined`条目作为空字符串.因此,具有一个"null"条目的数组呈现为空字符串. (8认同)
  • @sulest不,不是.在这些情况下,字符串将转换为另一个参数的类型.在OP的问题中,另一个参数正在转换为字符串. (3认同)

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]评价为真?

因为您正在使用非严格相等运算符==将数组与字符串进行比较- 所以它会在比较它们之前尝试将值转换为相同类型.

详细情况是:

  1. 您将字符串与对象进行比较,因此将对象强制转换为字符串:
  2. 当一个数组被转换为一个原始值时,它的.toString()方法被调用(正如其他答案所详细解释的),这相当于调用.join():
  3. 在单元素数组的情况下,只包含一个undefinednull返回空字符串
  4. 最后相当于空字符串

第三步是意外的one([null]+"" != null+""),如果它实际上将其转换为字符串,则结果将是,"null"并且您的等式为false.