JS中{}作为对象与空块作用域的区别及{}+[]输出差异解析
关于
console.log({}+[])的解析差异问题 两种解析逻辑说明
- 理论派的推导逻辑:部分观点认为
{}+[]会被拆分为两部分——开头的{}是空代码块,后续的+[]是一元加号运算。按照JS类型转换规则,空数组[]先转为空字符串"",再经一元+转换为数字0,因此认为最终输出应为0。 - 实际引擎的处理逻辑:所有JavaScript引擎在处理
console.log({}+[])时,都会将{}+[]视为空对象与空数组的二元加法运算。根据隐式类型转换规则:- 空对象
{}转为字符串的结果是"[object Object]" - 空数组
[]转为字符串的结果是"" - 两者执行字符串拼接后得到
"[object Object]",这就是console.log实际输出的内容。
- 空对象
解析差异的核心原因
差异源于代码上下文的解析规则:
- 当
{}+[]作为独立语句存在时,部分环境(如Chrome控制台)会将开头的{}解析为代码块,后续的+[]作为独立表达式执行,返回0; - 但在
console.log()的参数位置,{}+[]处于表达式上下文,引擎会强制将{}解析为对象字面量而非代码块,因此执行的是对象与数组的加法运算。
内容的提问来源于stack exchange,提问作者Rizwan Saifi
相关产品推荐
相关产品推荐

