ECMAScript规范未提及传值/传引用,对象赋值能否按值拷贝?
ECMAScript对象赋值与规范实现的说明
ECMAScript规范确实没提“按值传递”“按引用传递”这类术语,它的赋值逻辑核心是赋值值——但要注意:对于对象类型来说,这里的“值”是指向对象的引用(内存地址的抽象),而非对象本身的拷贝。
你问符合规范的实现能不能按值拷贝对象?答案是绝对不行,原因在于规范对对象赋值后的行为有明确约束:
- 执行
let obj1 = {x:1}; let obj2 = obj1;后,修改obj2.x = 2,规范要求obj1.x必须同步变为2。 - 如果实现采用值拷贝对象的方式,修改obj2不会影响obj1,这直接违反了规范规定的行为,属于不符合标准的实现。
规范里的赋值逻辑,处理对象时就是把对象的引用值赋给变量,所有合规的JS实现都必须遵守这个行为逻辑,不能自作主张改成拷贝对象本体——不然整个语言的基本行为一致性就会被破坏。
另外提一句,Emacs文档和这个问题完全不相关,它是编辑器的文档,本来就不会包含ECMAScript规范的细节,这类问题得以ECMAScript官方的行为约束为准。
内容的提问来源于stack exchange,提问作者Caleb
相关产品推荐
相关产品推荐

