为何对象属性前的多余逗号在该场景下不触发语法错误?
为什么对象字面量中带展开语法的逗号不会触发语法错误?
先看两种对比情况:
触发语法错误的代码
const a = { , a: 1 }
这段代码会直接抛出SyntaxError: Unexpected token ',',因为对象字面量里不允许出现孤立的逗号——这个逗号既没有前置的属性/表达式,也不属于任何合法的属性分隔场景。
不触发错误的代码
const a = { ...(false && {b: 1}), a: 1 }
这段代码里a: 1上方的逗号完全合法,原因如下:
- 首先,
false && {b: 1}的运算结果是false,而对象字面量中的展开语法遇到非对象值(布尔值、null、undefined这类)时,会直接忽略这个展开操作,相当于这里没有生成任何属性。 - 但语法层面上,这个逗号是用来分隔展开表达式和后面的
a: 1属性的,属于合法的属性列表分隔符。哪怕展开项最终没有产出任何属性,语法解析器依然认为这个逗号是属性列表的一部分,不是孤立的多余逗号。 - 简单说,这个逗号的“归属”是明确的——它属于展开表达式和下一个属性之间的分隔符,所以不会被判定为语法错误。
内容的提问来源于stack exchange,提问作者Jakob Basshunter Widmann
相关产品推荐
相关产品推荐

