js中以块语句开头的对象强制

Sci*_*ion 9 javascript

所以,有一件事我无法理解。

我毫无疑问地了解到:

{}+[]+{}+[1]
Run Code Online (Sandbox Code Playgroud)

"0[object Object]1"
Run Code Online (Sandbox Code Playgroud)

我真正不明白的是为什么

{}+[]+{}
Run Code Online (Sandbox Code Playgroud)

"[object Object][object Object]" 并不是 "0[object Object]"

我的理解是,第一个{}是块语句,因此被忽略。然后,我们确实有+[]+{}哪些结果"0[object Object]"

我在这里想念什么?

编辑:尽管主题相同,但另一个问题没有提及{}控制台将其解释为块代码还是对象。

geo*_*org 6

在评估表达式时,它取决于解析器在哪个语法位置。考虑:

console.log(eval('{}+[]'), '==', eval('{}; +[]'))
console.log({}+[])

console.log('---')

console.log(eval('{}+[]+{}+[1]'), '==', eval('{}; +[] + {} + [1]'))
console.log({}+[]+{}+[1])

console.log('---')

console.log(eval('{}+[]+{}'), '==', eval('{}; +[] + {}'))
console.log({}+[]+{})
Run Code Online (Sandbox Code Playgroud)

其中“ eval”块对应于“ statement”位置,裸露的“ console.logs”处于“ expression”位置。{}在语句位置,前导仅被视为一个块。

> let esprima = require('esprima');
undefined

> esprima.parse('{}+[]+{}')
Script {
  type: 'Program',
  body:
   [ BlockStatement { type: 'BlockStatement', body: [] },
     ExpressionStatement { type: 'ExpressionStatement', expression: [BinaryExpression] } ],
  sourceType: 'script' }

> esprima.parse('( {}+[]+{} )')
Script {
  type: 'Program',
  body:
   [ ExpressionStatement { type: 'ExpressionStatement', expression: [BinaryExpression] } ],
  sourceType: 'script' }
> 
Run Code Online (Sandbox Code Playgroud)

请注意,当您直接在控制台或repl中评估测试时,行为因平台而异,因为控制台/ repls使用不同的试探法来确定您的输入是语句还是表达式。有关示例,请参见此答案


归档时间:

查看次数:

90 次

最近记录:

7 年,2 月 前