我这里有一些代码,我想知道它们是相同的还是不同的。我很确定这两者应该是相同的,但我不确定我是否做对了。
let zoneComment = updatedMap[action.comment.zone]
? [...updatedMap[action.comment.zone]] : [];
let zoneComment = updatedMap[action.comment.zone]
? Object.assign([], updatedMap[action.comment.zone]) : [];
如果这些相同,那么我应该使用哪个,或者这有关系吗?我想使用最佳实践,所以如果您认为哪个更好,请说明。
最佳答案
在您的特定情况下,它们不相同。
原因是你有一个数组,而不是一个对象。
在数组上执行 ...
将展开数组中的所有元素(但不是属性)
执行 Object.assign
需要一个对象,因此它会将数组视为对象并复制所有 enumerable拥有属性,而不仅仅是元素:
const a = [1, 2, 3];
a.test = 'example';
const one = [...a] // [1, 2, 3];
const two = Object.assign([], a); // { '0': 1, '1': 2, '2': 3, 'test': 'example' }
console.log('\none');
for (let prop in one) {
console.log(prop);
}
console.log('\ntwo');
for (let prop in two) {
console.log(prop);
}
但是,如果将应用于对象的 ...
运算符与 Object.assign
进行比较,它们本质上是相同的:
// same result
const a = { name: 'test' }
console.log({ ...a })
console.log(Object.assign({}, a))
except ...
总是创建一个新对象,但 Object.assign
还允许您改变现有对象。
// same result
const a = { name: 'test' }
const b = { ...a, name: 'change' };
console.log(a.name); // test
Object.assign(a, { name: 'change'})
console.log(a.name); // change
请记住,Object.assign
已经是语言的一部分,而对象传播仍然只是一个提议,需要使用 babel 等工具进行预处理步骤(转译) .
关于javascript - Object.assign 和 object spread 之间的区别(使用 [...] 语法)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45888724/