我正在查看ECMA-262语法,以获取下一个代码的定义:
const v = (! + [] + []);
const c = (false + []);
console.log(v);
console.log(c);
这是什么?
到目前为止,我还没有发现任何有用的东西,有人知道为什么它会给出这些结果或对此有参考吗?
这是因为当您尝试将运算符应用到不同的数据结构时,JavaScript引擎将应用强制。
在第一种情况下,它的作用是:
将first []转换为基元,这是通过调用array的toString()方法执行的。toString方法将所有数组值连接到字符串。如果您有类似的东西(false + [1,2,3])
,将会得到:false1,2,3
第二步是将布尔值带入String上下文
现在我们将所有值都放在同一数据结构中,它将简单地将所有值连接在一起
在您的情况下,(! + [] + [])
其值为“ true”,长度为4。
《您不知道JS:类型和语法》这本书是了解JavaScript引擎所做的所有这些奇怪操作的瑰宝。
编辑:正如菲利克斯·克林(Felix Kling)所暗示的那样!运算符在的评估中具有不同的作用(! + [] + [])
。
在这种情况下,将发生以下情况:
! + []
评估为true。这是因为! + []
在那里把它们在一个布尔上下文[toNumber]操作上[应用],这是0
与!0
是true
true + []
被评估为'true'
。这是因为当您尝试向对象添加布尔值(数组是从对象派生的)时,[toString]操作将应用于两个项目。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句