为何浏览器控制台中{x} = {x:1}合法,加分号却报SyntaxError?
为什么
{x} = {x:1}合法但加了分号就报错? 这个问题其实是JavaScript语法解析规则和自动分号插入(ASI)共同搞出来的“小陷阱”,我来给你掰扯清楚:
不带分号的情况:{x} = {x:1}
当你写下这段代码时,JavaScript引擎会优先尝试把它解析成一个表达式语句。这里的{x}并不是你以为的“代码块”(代码块一般用来包裹if、for这类逻辑的执行语句),而是解构赋值的左侧匹配模式——因为它出现在赋值运算符=的左边,引擎立刻就能识别这是个解构操作:把右侧对象{x:1}里的x属性值,赋值给变量x。整个语句是完全合法的表达式语句,所以执行后x的值会被设为1。
带分号的情况:{x} = {x:1};
加上分号后,引擎的解析逻辑直接变了:它看到开头的{,会优先把它当成代码块的起始标记(此时没有任何上下文提示这是解构语法)。这个代码块里的x只是个孤立的标识符语句(语法上合法,但没实际作用),等代码块结束后,后面跟着的= {x:1};就成了一个孤立的赋值表达式——而JavaScript不允许赋值表达式直接出现在代码块后面(除非被包裹成合法的表达式语句),所以引擎会抛出SyntaxError: Unexpected token =,因为它完全没料到代码块后面会突然冒出来个=。
怎么让带分号的写法合法?
如果想保留分号同时让代码正常运行,只需要把整个解构赋值用括号包起来:
({x} = {x:1});
括号会强制引擎把内部内容解析成表达式,这样开头的{x}就会被识别为解构模式而非代码块,整个语句就能正常执行了。
内容的提问来源于stack exchange,提问作者Dave Demirkhanyan
相关产品推荐
相关产品推荐

