我正在查看 ECMA-262下一个代码定义的语法如下:
const v = (! + [] + []);
const c = (false + []);
console.log(v);
console.log(c);
背后是什么?
到现在为止我没有发现任何有用的东西,有谁知道为什么它会给出这些结果或有相关引用吗?
最佳答案
这是因为当您尝试将运算符应用于不同的数据结构时,JavaScript 引擎会应用 coercion .
在第一种情况下它所做的是:
将第一个[]转换为primitive,调用数组的toString()方法完成。 toString 方法将所有数组值连接到一个字符串。如果你想要类似
(false + [1,2,3])
你会得到:false1,2,3
第二步是将 bool 值带入String上下文
既然我们在同一数据结构中拥有所有值,它将简单地连接所有这些值
在您的情况下,(! + [] + [])
被评估为长度为 4 的“true”。
本书You Don't Know JS: Types & Grammar是理解 JavaScript 引擎所做的所有这些奇怪操作的瑰宝。
编辑:正如 Felix Kling 所建议的那样!运算符在 (! + [] + [])
的计算中具有不同的作用。
在这种情况下发生的是:
! + []
被评估为 true。这是因为! + []
将它们置于 bool 上下文中,其中 [toNumber] 操作应用于 [],即0
和!0
是真
true + []
的计算结果为'true'
。这是因为当您尝试使用对象添加 bool 值(数组派生自对象)时,[toString] 操作将应用于两个项目。
关于javascript - 为什么 (!+[]+[]) 在 Javascript 中是 'true' 而 (false + []) 是 'false'?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54189032/