首页 > 解决方案 > 为什么 (!+[]+[]) 在 Javascript 中是 'true' 而 (false + []) 是 'false'?

问题描述

我正在查看ECMA-262语法以定义下面的下一个代码:

const v = (! + [] + []);
const c = (false + []);

console.log(v);
console.log(c);

背后是什么?

到目前为止,我没有发现任何有用的东西,有谁知道它为什么给出这些结果或有关于它的参考资料?

标签: javascriptarraysecmascript-6

解决方案


这是因为当您尝试将运算符应用于不同的数据结构时,JavaScript 引擎会应用强制

在第一种情况下,它的作用是:

  1. 将 first [] 转换为基元,这是通过调用数组的 toString() 方法来执行的。toString 方法将所有数组值连接到一个字符串。如果你有类似的东西,(false + [1,2,3])你会得到:false1,2,3

  2. 第二步是将布尔值带入 String 上下文中

  3. 现在我们在同一个数据结构中拥有所有值,它将简单地连接所有值

在您的情况下(! + [] + []),被评估为长度为 4 的“真”。

You Don't Know JS: Types & Grammar这本书是理解 JavaScript 引擎所做的所有这些奇怪操作的瑰宝。

编辑:正如菲利克斯克林建议的那样!算子在评估中扮演着不同的角色(! + [] + [])

在这种情况下,会发生什么:

  • ! + []被评估为真。这是因为! + []将它们置于布尔上下文中,其中[toNumber]操作应用于 [] 是0并且!0true

  • true + []被评估为'true'。这是因为当您尝试使用对象添加布尔值(数组派生自对象)时, [toString]操作将应用于这两个项目。


推荐阅读