一个错误让我在 45 分钟的循环中挠挠头,当我终于意识到分配一个包含另一个(空)数组的数组时myArray = [[]],它与false以下内容等效:
if (myArray == false) {} // true
Run Code Online (Sandbox Code Playgroud)
我意识到这一点,if (myArray === false) {} // false但为什么长度 > 0 的数组完全等同false于?
这是因为==通过抽象相等比较操作递归地将其操作数转换为它可以比较的东西,直到它们的类型相同:
x == y,由于y是布尔值,它执行x == ToNumber(y)( ToNumber)的结果。ToNumber(false)是0,所以它x == 0。x是一个对象并且0是一个数字,所以它确实ToPrimitive(x) == 0。( ToPrimitive.)ToPrimitive([[]])是""因为它最终join在数组上执行 a (通过Array.prototype.toString),将操作数转换为字符串。所以现在我们有"" == 0.ToNumber("") == 0。ToNumber("")是0,所以我们最终得出0 == 0哪个是真的。(在查看规范中的算法时,不要被!前面的某些操作抛出,例如ToNumber。它不像在 JavaScript中那样意味着否定。它意味着该操作永远不会返回突然完成。本指南阅读指南规范有助于此类事情。)
| 归档时间: |
|
| 查看次数: |
69 次 |
| 最近记录: |