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)
什么是它?
到目前为止,我没有找到任何有用的信息,是否有人知道为什么它会给出这些结果或有关于它的参考?
这是因为当您尝试将运算符应用于不同的数据结构时,JavaScript引擎会应用强制.
在第一种情况下,它的作用是:
将first []转换为primitive,这是通过调用array的toString()方法执行的.toString方法将所有数组值连接到一个字符串.如果你(false + [1,2,3])得到像你会得到的东西:false1,2,3
第二步是将布尔值放在String上下文中
现在我们拥有相同数据结构中的所有值,它将简单地连接所有这些值
在您的情况下(! + [] + []),评估为'true',其长度为4.
你不了解JS:Types&Grammar这本书是理解JavaScript引擎所做的所有这些奇怪操作的宝石.
编辑:正如Felix Kling所暗示的那样!运营商在评估中有不同的作用(! + [] + []).
在这种情况下会发生的是:
! + []被评估为真.这是因为! + []将它们置于布尔上下文中,其中[toNumber]操作应用于[],0而且!0是true
true + []被评估为'true'.这是因为当您尝试使用对象添加布尔值(数组是从对象派生的)时,[toString]操作将应用于这两个项目.