据我所知,散布运算符会在操作后返回一个新对象:
let a = {a:1};
let b = {a: 2}
let a = {...a,...b}
因此,最后一个a
未引用到a
,它是内存中的新对象。
是否可以在不更改初始对象的情况下使用扩展运算符,我的意思是在内存中引用?
答案 0 :(得分:2)
12.2.6.7 Runtime Semantics: Evaluation
和12.2.6.8 Runtime Semantics: PropertyDefinitionEvaluation
确保从使用“扩展语法”的对象文字返回的对象始终是新对象。
规范的相关部分:
- 让
$.post
为obj
。
和
ObjectCreate(%ObjectPrototype%)
1.令PropertyDefinition:...AssignmentExpression
为求值exprValue
的结果。
2.让AssignmentExpression
为?fromValue
。
3.让GetValue(exprValue)
为一个新的空列表。
4.返回excludedNames
。
除了直接分配其属性外,目前没有其他方法可以对对象进行突变。
正如@Heretic Monkey在评论中指出的那样:当我回答有关? CopyDataProperties(object, fromValue, excludedNames)
时,该问题被标记为typescript
。问题是TS编译器必须保留本机js运行时语义,因此在这种情况下,可以引用ES2018标准。