为什么对象解构重新赋值时需要用括号包裹赋值语句?
报错原因
JavaScript解析器有固定的语法优先级规则:当行首以{开头时,会默认将这段内容识别为代码块(block statement),而非对象解构的语法标识。
你没有加括号的写法里:
let item_one, item_two; { item_one, item_two } = testFunction()
第二行的{被解析成了代码块的开头,代码块内部不允许直接出现=赋值操作,因此运行到=时就会抛出「Unexpected token "="」的语法错误。
加括号的作用
圆括号()的核心作用是强制语法解析规则:被圆括号包裹的内容会被JS解析器识别为表达式(expression),而非独立的代码块语句。
你套了括号之后:
let item_one, item_two; ({ item_one, item_two } = testFunction())
解析器不会再把开头的{当成代码块的起始,而是正确识别为对象解构赋值的模式,因此可以正常完成对已声明变量的重新赋值。
额外说明:这种规则冲突只会出现在「解构赋值左侧没有let/const/var等声明关键字、且{处于行首」的场景。如果解构前带了声明关键字,解析器会自动识别为解构语法,不会触发代码块的解析逻辑,所以let { item_one, item_two } = testFunction()的写法是合法的,只是不满足你复用已声明变量的需求。
内容的提问来源于stack exchange,提问作者Igor Moraru
相关产品推荐
相关产品推荐

