假设我有一个options
变量,我想设置一些默认值。
这两种选择的优点/缺点是什么?
使用对象扩散
options = {...optionsDefault, ...options};
或者使用Object.assign
options = Object.assign({}, optionsDefault, options);
这就是让我好奇的commit。
发布于 2019-01-22 09:54:58
我认为扩散运算符和Object.assign
之间的一个很大的区别在当前的答案中似乎没有提到,那就是扩散运算符不会将源对象的原型复制到目标对象。如果你想给一个对象添加属性,但又不想改变它的实例,那么你就必须使用Object.assign
。
编辑:我已经意识到我的例子有误导性。扩展操作符在第一个参数设置为空对象的情况下去糖化为Object.assign
。在下面的代码示例中,我将error作为Object.assign
调用的第一个参数,因此这两个参数并不相等。Object.assign
的第一个参数实际上被修改,然后返回,这就是为什么它保留其原型的原因。我在下面添加了另一个示例:
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
发布于 2019-01-02 15:26:52
其他答案都是旧的,得不到好的答案。
下面的例子是对象字面量,有助于两者如何相互补充,以及如何不能相互补充(因此不同):
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
发布于 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()的所有功能。
https://stackoverflow.com/questions/32925460
复制相似问题