javascript - Object.assign 和 object spread 之间的区别(使用 [...] 语法)?

标签 javascript ecmascript-6

我这里有一些代码,我想知道它们是相同的还是不同的。我很确定这两者应该是相同的,但我不确定我是否做对了。

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/

相关文章:

javascript - "export default const"上的意外 token

javascript - react +不可变.js : merge Map into List of Maps to update state

javascript - jQuery 适配屏幕插件

javascript - 如何使用javascript更改点击时的图片srcset属性

javascript - 使用 mongoose 保存新数据时避免重复

javascript - 来自未定义类的构造函数中的新对象

javascript - "Could not send request "Postman网页版出错

javascript - 使用javascript从web sql中的结果集中删除行

javascript - 使用某种函数式编程将一个对象映射到另一个对象

javascript - ES6 map 功能支持 - IE11 中的支持太大了吗?