扩展运算符在操作后是否返回新对象?

时间:2018-10-23 23:23:22

标签: typescript

据我所知,散布运算符会在操作后返回一个新对象:

let a = {a:1};
let b = {a: 2}
let a = {...a,...b}

因此,最后一个a未引用到a,它是内存中的新对象。

是否可以在不更改初始对象的情况下使用扩展运算符,我的意思是在内存中引用?

1 个答案:

答案 0 :(得分:2)

12.2.6.7 Runtime Semantics: Evaluation12.2.6.8 Runtime Semantics: PropertyDefinitionEvaluation确保从使用“扩展语法”的对象文字返回的对象始终是新对象。

规范的相关部分:

  
      
  1. $.postobj
  2.   

  

ObjectCreate(%ObjectPrototype%)
  1.令PropertyDefinition:...AssignmentExpression为求值exprValue的结果。
  2.让AssignmentExpression为? fromValue
  3.让GetValue(exprValue)为一个新的空列表。
  4.返回excludedNames

除了直接分配其属性外,目前没有其他方法可以对对象进行突变。

正如@Heretic Monkey在评论中指出的那样:当我回答有关? CopyDataProperties(object, fromValue, excludedNames)时,该问题被标记为typescript。问题是TS编译器必须保留本机js运行时语义,因此在这种情况下,可以引用ES2018标准。