空JavaScript阵列的布尔值冲突

Mat*_*ela 39 javascript

任何人都可以解释为什么以下两个陈述都评价为

[] == false
Run Code Online (Sandbox Code Playgroud)

!![]
Run Code Online (Sandbox Code Playgroud)

这个问题完全出于好奇,为什么会发生这种情况而不是如何最好地测试数组是否为空.

CMS*_*CMS 61

第一个:

[] == false
Run Code Online (Sandbox Code Playgroud)

==操作者进行类型转换到它的操作数,在此情况下,双方被转换为数字,对所采取的步骤摘要相等比较算法将是:

  • object == boolean
  • object == number
  • string == number
  • number == number

在代码中:

[] == false; // convert false to Number
[] == 0;     // convert [] to Primitive (toString/valueOf)
"" == 0;     // convert "" to Number
0  == 0;     // end
Run Code Online (Sandbox Code Playgroud)

第二个比较,[]转换为原始,它们valueOftoString方法被执行,但由于valueOf在Array对象上返回对象本身(从中继承Object.prototype),然后使用该toString方法.

如您所见,两个操作数都转换为Number,并且两者都为零,例如:

Number([]) == 0;
Number(false) == 0;
Run Code Online (Sandbox Code Playgroud)

转换为Number时,空数组产生零,因为其字符串表示形式为空字符串:

[].toString(); // ""
Run Code Online (Sandbox Code Playgroud)

并且一个空字符串转换为Number,产生零:

+""; // 0
Run Code Online (Sandbox Code Playgroud)

现在,double negation(!![])产生true,因为所有对象实例都是真实的:

![];  // false, [] is truthy
!![]; // true, negation
Run Code Online (Sandbox Code Playgroud)

唯一值得假的是:

  • null
  • undefined
  • 0
  • NaN
  • "" (一个空字符串)
  • false

true转换为布尔值时会产生任何其他内容.

也可以看看: