任何人都可以解释为什么以下两个陈述都评价为真?
[] == false
Run Code Online (Sandbox Code Playgroud)
和
!![]
Run Code Online (Sandbox Code Playgroud)
这个问题完全出于好奇,为什么会发生这种情况而不是如何最好地测试数组是否为空.
CMS*_*CMS 61
第一个:
[] == false
Run Code Online (Sandbox Code Playgroud)
在==操作者进行类型转换到它的操作数,在此情况下,双方被转换为数字,对所采取的步骤摘要相等比较算法将是:
在代码中:
[] == false; // convert false to Number
[] == 0; // convert [] to Primitive (toString/valueOf)
"" == 0; // convert "" to Number
0 == 0; // end
Run Code Online (Sandbox Code Playgroud)
第二个比较,[]转换为原始,它们valueOf和toString方法被执行,但由于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)
唯一值得假的是:
nullundefined0NaN"" (一个空字符串)falsetrue转换为布尔值时会产生任何其他内容.
也可以看看:
| 归档时间: |
|
| 查看次数: |
9173 次 |
| 最近记录: |