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

Tho*_*pra 3 javascript arrays ecmascript-6

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

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

console.log(v);
console.log(c);
Run Code Online (Sandbox Code Playgroud)

什么是它?

到目前为止,我没有找到任何有用的信息,是否有人知道为什么它会给出这些结果或有关于它的参考?

Bur*_*imi 5

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

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

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

  2. 第二步是将布尔值放在String上下文中

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

在您的情况下(! + [] + []),评估为'true',其长度为4.

你不了解JS:Types&Grammar这本书是理解JavaScript引擎所做的所有这些奇怪操作的宝石.

编辑:正如Felix Kling所暗示的那样!运营商在评估中有不同的作用(! + [] + []).

在这种情况下会发生的是:

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

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

  • *"你可以从那个角度看它是一个值"*号操作符不是值,*操作*值.我只提到了这一点,因为你的例子似乎暗示`!`被转换为`false`. (2认同)