Chrome控制台中{...x.d} === x.d无括号报错原因咨询
为什么Chrome控制台中
{...x.d} === x.d会报错? 先看你给出的代码示例:
var x = {d: {a: 1}, b: 3, c: "hello"} {...x.d} === x.d // Chrome控制台报错[Uncaught SyntaxError: Unexpected token '...'] x.d === {...x.d} // 返回预期的false ({...x.d} === x.d) // 可正常执行 console.log({...x.d} === x.d) // 正常运行
核心原因是JavaScript引擎对代码上下文的解析规则不同:
- 当代码以
{开头时,引擎会默认把它识别为**代码块(block statement)**的起始标记,而非对象字面量。代码块里只能放合法的语句,展开语法...在这里完全不符合语法规则,所以直接抛出语法错误。 - 当
{...x.d}出现在运算符(比如===)右侧,或者作为函数(比如console.log)的参数时,它处于表达式上下文中。此时引擎会把{}解析为对象字面量,...x.d就是对象展开操作——用来创建一个x.d的浅拷贝,所以能正常执行。 - 加括号
({...x.d} === x.d)的作用是强制把内部内容转为表达式上下文,让引擎把{...x.d}当成对象字面量处理,自然不会报错。
额外补充:x.d === {...x.d}返回false是因为展开操作创建了新对象,两个对象的内存引用地址不同,严格相等比较结果自然为false,这是符合预期的。
内容的提问来源于stack exchange,提问作者soumitra
相关产品推荐
相关产品推荐

