所以,有一件事我无法理解。
我毫无疑问地了解到:
{}+[]+{}+[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]"
我在这里想念什么?
编辑:尽管主题相同,但另一个问题没有提及{}控制台将其解释为块代码还是对象。
在评估表达式时,它取决于解析器在哪个语法位置。考虑:
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 次 |
| 最近记录: |