为什么 {} + [] == 0, 而 {} + {} == ‘[object Object][object Object]’

发布于 2022-09-07 22:08:20 字数 267 浏览 15 评论 0

为什么 {} + [] == 0 ?

在将操作符两边的参数当作对象的情况下,{} + [] == '[object Object]',但在控制台下返回的结果确是 0。
搜过这类的问题,说的是 {} 被当做了一个块级作用域, + 被当做了一个一元操作符,将 [] 转化为了number 类型,所以为 0,我能够理解这种解释
但为什么 {} + {} 中没有按照前面模式进行处理,+ {} 虽然会得到 NaN, 但是并不会报错呀,是能够正常处理的,前面的 {} 为什么没有被当做块级作用域?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

紙鸢 2022-09-14 22:08:20

我把{}+{}生成了AST结果如下

{
  "type": "Program",
  "start": 0,
  "end": 5,
  "body": [
    {
      "type": "BlockStatement",
      "start": 0,
      "end": 2,
      "body": []
    },
    {
      "type": "ExpressionStatement",
      "start": 2,
      "end": 5,
      "expression": {
        "type": "UnaryExpression",
        "start": 2,
        "end": 5,
        "operator": "+",
        "prefix": true,
        "argument": {
          "type": "ObjectExpression",
          "start": 3,
          "end": 5,
          "properties": []
        }
      }
    }
  ],
  "sourceType": "module"
}

AST可以看出,第一个{}还是被转化为代码块,+为一元运算符,然鹅在chrome的表现中确实是被当做算术运算符处理"[object Object][object Object]",这或许是chrome的特性(胡扯的,我并不知道为什么),在firefox中结果仍然为NaN

甜尕妞 2022-09-14 22:08:20

以下是你不知道的 JavaScript(中卷)第五章P102原文:


还有一个坑常被提到(涉及强制类型转换,参见第 4 章):

 [] + {}; // "[object Object]"
 {} + []; // 0

表面上看 + 运算符根据第一个操作数([] 或 {})的不同会产生不同的结果,实则不然。 第一行代码中,{} 出现在 + 运算符表达式中,因此它被当作一个值(空对象)来处理。第
4 章讲过 [] 会被强制类型转换为 "",而 {} 会被强制类型转换为 "[object Object]"
但在第二行代码中,{} 被当作一个独立的空代码块(不执行任何操作)。代码块结尾不需 要分号,所以这里不存在语法上的问题。最后 + [] 将 [] 显式强制类型转换(参见第 4 章) 为 0。


这个系列对js中乱七八糟的问题都讲的很细

一片旧的回忆 2022-09-14 22:08:20

因为你把{}+{}写在括号里了
图片描述

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文