{} + {}
"[object Object][object Object]"
摘要部分的转换对象:toString 和 valueOf一文描述了 object( ) 在主要代码流中的行为,但在控制台中的行为有所不同。我什至在某处看到了一个类似的例子:. 它说左操作数被视为一个空的“代码块”,而右操作数被转换为一个数字,这将导致.{}{} + {}NaN
一方面,我想问解析器如何看待这个例子:{} - {}.
- 解析器忽略左侧对象并将其视为“代码块”。那么问题来了,为什么上面的例子中会出现拼接呢?
- 他将它们引向一个数字 (NaN) 并减去它们。
PS:如果我懂英语并且能很好地理解 ECMAScript 文档,我就不会问了。

主代码流是一个不属于表达式的地方。
以下是只能放在主代码流中的语言点:
如果有两个相似的构造,其中一个只能存在于主线程中,那么将使用这个标准来区分它们:如果代码放在主码流中,则选择相应的构造,如果在一个表达式中,然后是另一个。
至于 entry
{}+{},在主代码流的情况下,它的值通常根本没有得到任何地方,尽管它因此显示在 REPL 环境中。第一个花括号意味着打开一个代码块,然后第二个花括号结束它。然后出现一个加号——我们没有左操作数,所以它是一元的。我们已经在表达了。表达式中的花括号开始一个对象。Next - 结束对象。事实+{}证明,然后+"[object Object]"和NaN。在 c 的情况下
console.log,函数调用本身形成一个表达式。因此,第一对括号被转换为一个对象,而整个总和,在转换后,被转换为字符串连接。获取代码的唯一方法(至少在 ES2018- 中)是将带有代码的字符串传递给 eval。
至于 chrome 控制台——他们似乎已经明智地确定了花括号中的东西是一个对象还是一段代码。此外,优先考虑对象。我认为这样做是为了更方便,如果你在控制台中输入一个表达式,那么你想要表达式的结果,你不会在主代码流中得到。但值得注意的是,控制台中的这个东西只适用于顶级代码(即使如此也并非总是如此),不适用于嵌套代码:
而且猜测逻辑也没有那么复杂:如果代码以 开头
{和结尾},这不是单行注释的一部分,那么它首先会尝试将其解析为表达式,如果它不起作用,然后作为声明:铸件。如果可以到数字导致数字。
如果它不能,那么它会导致一个字符串,{} + {},导致转换为一个字符串,连接 2 个字符串。
减法时,认为两个操作数都是数字,不发生转换,返回NaN