首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >对象扩散与Object.assign

对象扩散与Object.assign
EN

Stack Overflow用户
提问于 2015-10-04 01:33:23
回答 6查看 235.8K关注 0票数 501

假设我有一个options变量,我想设置一些默认值。

这两种选择的优点/缺点是什么?

使用对象扩散

代码语言:javascript
复制
options = {...optionsDefault, ...options};

或者使用Object.assign

代码语言:javascript
复制
options = Object.assign({}, optionsDefault, options);

这就是让我好奇的commit

EN

回答 6

Stack Overflow用户

发布于 2019-01-22 09:54:58

我认为扩散运算符和Object.assign之间的一个很大的区别在当前的答案中似乎没有提到,那就是扩散运算符不会将源对象的原型复制到目标对象。如果你想给一个对象添加属性,但又不想改变它的实例,那么你就必须使用Object.assign

编辑:我已经意识到我的例子有误导性。扩展操作符在第一个参数设置为空对象的情况下去糖化为Object.assign。在下面的代码示例中,我将error作为Object.assign调用的第一个参数,因此这两个参数并不相等。Object.assign的第一个参数实际上被修改,然后返回,这就是为什么它保留其原型的原因。我在下面添加了另一个示例:

代码语言:javascript
复制
const error = new Error();
error instanceof Error // true

const errorExtendedUsingSpread = {
  ...error,
  ...{
    someValue: true
  }
};
errorExtendedUsingSpread instanceof Error; // false

// What the spread operator desugars into
const errorExtendedUsingImmutableObjectAssign = Object.assign({}, error, {
    someValue: true
});
errorExtendedUsingImmutableObjectAssign instanceof Error; // false

// The error object is modified and returned here so it keeps its prototypes
const errorExtendedUsingAssign = Object.assign(error, {
  someValue: true
});
errorExtendedUsingAssign instanceof Error; // true

另请参阅:https://github.com/tc39/proposal-object-rest-spread/blob/master/Spread.md

票数 54
EN

Stack Overflow用户

发布于 2019-01-02 15:26:52

其他答案都是旧的,得不到好的答案。

下面的例子是对象字面量,有助于两者如何相互补充,以及如何不能相互补充(因此不同):

代码语言:javascript
复制
var obj1 = { a: 1,  b: { b1: 1, b2: 'b2value', b3: 'b3value' } };

// overwrite parts of b key
var obj2 = {
      b: {
        ...obj1.b,
        b1: 2
      }
};
var res2 = Object.assign({}, obj1, obj2); // b2,b3 keys still exist
document.write('res2: ', JSON.stringify (res2), '<br>');
// Output:
// res2: {"a":1,"b":{"b1":2,"b2":"b2value","b3":"b3value"}}  // NOTE: b2,b3 still exists

// overwrite whole of b key
var obj3 = {
      b: {
        b1: 2
      }
};
var res3 = Object.assign({}, obj1, obj3); // b2,b3 keys are lost
document.write('res3: ', JSON.stringify (res3), '<br>');
// Output:
  // res3: {"a":1,"b":{"b1":2}}  // NOTE: b2,b3 values are lost

这里还有几个小例子,同样适用于array & object:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax

票数 2
EN

Stack Overflow用户

发布于 2016-09-08 13:22:23

这现在是ES6的一部分,因此是标准化的,也记录在MDN上:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator

它使用起来非常方便,而且在对象解构方面也很有意义。

上面列出的一个剩余优势是Object.assign()的动态功能,但是这就像将数组分散到文字对象中一样简单。在编译后的babel输出中,它完全使用Object.assign()所演示的内容。

因此,正确的答案应该是使用对象扩散,因为它现在是标准化的,被广泛使用(参见react、redux等),易于使用,并且具有Object.assign()的所有功能。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32925460

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档