RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 734725
Accepted
Виталик Черный
Виталик Черный
Asked:2020-10-23 21:11:43 +0000 UTC2020-10-23 21:11:43 +0000 UTC 2020-10-23 21:11:43 +0000 UTC

{} + {}。为什么会有这样的结果?

  • 772

{} + {} "[object Object][object Object]"

摘要部分的转换对象:toString 和 valueOf一文描述了 object( ) 在主要代码流中的行为,但在控制台中的行为有所不同。我什至在某处看到了一个类似的例子:. 它说左操作数被视为一个空的“代码块”,而右操作数被转换为一个数字,这将导致.{}{} + {}NaN

一方面,我想问解析器如何看待这个例子:{} - {}.

  1. 解析器忽略左侧对象并将其视为“代码块”。那么问题来了,为什么上面的例子中会出现拼接呢?
  2. 他将它们引向一个数字 (NaN) 并减去它们。

在此处输入图像描述

PS:如果我懂英语并且能很好地理解 ECMAScript 文档,我就不会问了。

javascript
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Qwertiy
    2020-10-30T05:23:43Z2020-10-30T05:23:43Z

    主代码流是一个不属于表达式的地方。

    以下是只能放在主代码流中的语言点:

    • 函数声明(不同于函数表达式)
    • 代码块(不同于对象)
    • 标签(不同于属性名称)
    • 该语言的所有句法结构:if、else、try、var 等。

    如果有两个相似的构造,其中一个只能存在于主线程中,那么将使用这个标准来区分它们:如果代码放在主码流中,则选择相应的构造,如果在一个表达式中,然后是另一个。

    至于 entry {}+{},在主代码流的情况下,它的值通常根本没有得到任何地方,尽管它因此显示在 REPL 环境中。第一个花括号意味着打开一个代码块,然后第二个花括号结束它。然后出现一个加号——我们没有左操作数,所以它是一元的。我们已经在表达了。表达式中的花括号开始一个对象。Next - 结束对象。事实+{}证明,然后+"[object Object]"和NaN。

    在 c 的情况下console.log,函数调用本身形成一个表达式。因此,第一对括号被转换为一个对象,而整个总和,在转换后,被转换为字符串连接。

    获取代码的唯一方法(至少在 ES2018- 中)是将带有代码的字符串传递给 eval。

    function run(code) {
      try {
        console.log(eval(code))
      } catch(e) {
        console.log(e.name + " " + e.message)
      }
    }
    
    run('{console.log("I am the code block")} + {i:0, am:1, an:2, object:3}')
    run('({a:0, pair:1} + {of:2, objects:3})') // круглые скобки
    run('{not_object:0} + {object:1}') // метка!
    run('{not_object:0, really_not:1} + {object:2}') // ошибка - метка не может быть вне основного потока
    run('{not_object:0; really_not:1} + {object:1}') // `;`, а не `,` - две метки

    至于 chrome 控制台——他们似乎已经明智地确定了花括号中的东西是一个对象还是一段代码。此外,优先考虑对象。我认为这样做是为了更方便,如果你在控制台中输入一个表达式,那么你想要表达式的结果,你不会在主代码流中得到。但值得注意的是,控制台中的这个东西只适用于顶级代码(即使如此也并非总是如此),不适用于嵌套代码:

    铬控制台截图

    而且猜测逻辑也没有那么复杂:如果代码以 开头{和结尾},这不是单行注释的一部分,那么它首先会尝试将其解析为表达式,如果它不起作用,然后作为声明:

    更多示例的屏幕截图

    • 12
  2. Azamat Galiyev
    2020-11-02T07:01:57Z2020-11-02T07:01:57Z

    铸件。如果可以到数字导致数字。

    如果它不能,那么它会导致一个字符串,{} + {},导致转换为一个字符串,连接 2 个字符串。

    减法时,认为两个操作数都是数字,不发生转换,返回NaN

    • -1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5