javascript - 为什么 (!+[]+[]) 在 Javascript 中是 'true' 而 (false + []) 是 'false'?

标签 javascript arrays ecmascript-6

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

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

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

背后是什么?

到现在为止我没有发现任何有用的东西,有谁知道为什么它会给出这些结果或有相关引用吗?

最佳答案

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

在第一种情况下它所做的是:

  1. 将第一个[]转换为primitive,调用数组的toString()方法完成。 toString 方法将所有数组值连接到一个字符串。如果你想要类似 (false + [1,2,3]) 你会得到:false1,2,3

  2. 第二步是将 bool 值带入String上下文

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

在您的情况下,(! + [] + []) 被评估为长度为 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/

相关文章:

javascript - 使用 JavaScript 将按钮元素移动到不同的 div(父级)

javascript - 无法对矩形应用排序

javascript - 基础选项卡不起作用

javascript - REACT 16.3 - 将 props 数组渲染为 map (可选)

ecmascript-6 - ES6 类继承解决方法名称冲突

javascript - 现代 JavaScript 中是否存在以前使用过 "bind"的情况下无法使用箭头函数的情况?

javascript - 在 html 文本区域中显示文件内容时出现换行问题 - javascript PHP

Java 数组列表栈

java - char 数组值未更改为大写

javascript - 奇怪的函数参数