javascript - 为什么 (!+[]+[]) 在 Javascript 中是 'true' 而 (false + []) 是 'false'?
问题描述
我正在查看ECMA-262语法以定义下面的下一个代码:
const v = (! + [] + []);
const c = (false + []);
console.log(v);
console.log(c);
背后是什么?
到目前为止,我没有发现任何有用的东西,有谁知道它为什么给出这些结果或有关于它的参考资料?
解决方案
这是因为当您尝试将运算符应用于不同的数据结构时,JavaScript 引擎会应用强制。
在第一种情况下,它的作用是:
将 first [] 转换为基元,这是通过调用数组的 toString() 方法来执行的。toString 方法将所有数组值连接到一个字符串。如果你有类似的东西,
(false + [1,2,3])
你会得到:false1,2,3
第二步是将布尔值带入 String 上下文中
现在我们在同一个数据结构中拥有所有值,它将简单地连接所有值
在您的情况下(! + [] + [])
,被评估为长度为 4 的“真”。
You Don't Know JS: Types & Grammar这本书是理解 JavaScript 引擎所做的所有这些奇怪操作的瑰宝。
编辑:正如菲利克斯克林建议的那样!算子在评估中扮演着不同的角色(! + [] + [])
。
在这种情况下,会发生什么:
! + []
被评估为真。这是因为! + []
将它们置于布尔上下文中,其中[toNumber]操作应用于 [] 是0
并且!0
是true
true + []
被评估为'true'
。这是因为当您尝试使用对象添加布尔值(数组派生自对象)时, [toString]操作将应用于这两个项目。
推荐阅读
- c++ - 在 C++ 中创建对象时出现段错误
- android - 在android上以编程方式获取来电号码
- java - mondoDB Java 查询
- java - 如何在 Java 中将 String 转换为 DataInputStream 类型?
- javascript - 在循环中从文本数组中对 HTML textarea 内容进行分页
- ios - 使用无密码类型崩溃应用程序的 Firebase 身份验证
- python - 将 djongo 用于 django 2.1.5 和 mongodb 4 的问题
- machine-learning - NLP 预训练模型(例如 ELMo、Bert)的数据预处理
- python - 在 bs4 中定位元素
- opengl - glGenBuffers 返回零表示什么?