Typescript spread运算符是否在操作后返回新对象?
据我所知,spread运算符在操作后返回一个新对象:Typescript spread运算符是否在操作后返回新对象?,typescript,Typescript,据我所知,spread运算符在操作后返回一个新对象: let a = {a:1}; let b = {a: 2} let a = {...a,...b} 因此,最后一个a没有引用到a,它是内存中的一个新对象 是否可以在不更改初始对象(我是指内存中的引用)的情况下使用扩展运算符?它由保证,并且从具有“扩展语法”的对象文本返回的对象始终是新对象 规范的相关部分: 让obj成为ObjectCreate(%ObjectPrototype%) 及 属性定义:…赋值表达式 1.让exprValue作为计算
let a = {a:1};
let b = {a: 2}
let a = {...a,...b}
因此,最后一个a
没有引用到a
,它是内存中的一个新对象
是否可以在不更改初始对象(我是指内存中的引用)的情况下使用扩展运算符?它由保证,并且从具有“扩展语法”的对象文本返回的对象始终是新对象
规范的相关部分:
obj
成为ObjectCreate(%ObjectPrototype%)
属性定义:…赋值表达式
1.让
exprValue
作为计算AssignmentExpression
的结果2.让
fromValue
be<代码>获取值(导出值)3.让
excludedNames
成为一个新的空列表。4.返回
?CopyDataProperties(对象、fromValue、excludedNames)
除了直接指定对象的属性外,目前没有其他方法可以改变对象
如评论中所述:当我回答关于javascript
的问题时,问题被标记为typescript
。问题是TS编译器必须保留本机js运行时语义,因此在这种情况下,可以参考ES2018标准。它由保证,并且从具有“扩展语法”的对象文本返回的对象始终是新对象
规范的相关部分:
obj
成为ObjectCreate(%ObjectPrototype%)
属性定义:…赋值表达式
1.让
exprValue
作为计算AssignmentExpression
的结果2.让
fromValue
be<代码>获取值(导出值)3.让
excludedNames
成为一个新的空列表。4.返回
?CopyDataProperties(对象、fromValue、excludedNames)
除了直接指定对象的属性外,目前没有其他方法可以改变对象
如评论中所述:当我回答关于
javascript
的问题时,问题被标记为typescript
。问题是TS编译器必须保留本机js运行时语义,因此在这种情况下,可以参考ES2018标准。这是不可能的-ES2018保证它始终是一个新对象。PS:这不是运算符,而是“扩展语法”,有其他选择吗?如下所示:var obj=Object.assign(updateobject)代码>替代什么?我认为没有比对象更好的方法了。分配(a,b)
将b
的属性添加到现有对象a
。如果您想保留相同的对象-只需手动分配其属性这是不可能的-ES2018保证它始终是一个新对象。PS:这不是运算符,而是“扩展语法”,有其他选择吗?如下所示:var obj=Object.assign(updateobject)代码>替代什么?我认为没有比对象更好的方法了。分配(a,b)
将b
的属性添加到现有对象a
。如果要保留相同的对象,只需手动分配到其属性。请注意,问题已标记为typescript
;给定的代码可能会也可能不会转换为扩展语法,这取决于转换目标。@HereticsMonkey它必须保留扩展语法语义though@HereticMonkey有趣的是,TS规范根本没有提到对象参数扩展语法(我将第二个let a
更改为let ab
)您可以看到它们使用对象。分配:(.顺便说一句,你的答案很准确,只是想提醒你TypeScript的…怪癖。请注意,问题被标记为TypeScript
;给定的代码可能会也可能不会转换成排列语法,这取决于转换目标。@HereticMonkey它必须保留排列语法语义though@HereticMonkey这很有趣TS规范根本没有提到对象参数扩展语法。如果您查看传输的代码(我将第二个let a
更改为let ab
),您可以看到它们使用object.assign
:(。顺便说一下,您的答案很准确,只是想提醒您TypeScript的…怪癖。