Object.assign 和 just as assign 之间的区别

Difference between Object.assign and just assign

本文关键字:assign 区别 之间 just Object as      更新时间:2023-09-26

我想知道这两者之间的区别:

Object.assign(otherObject, {
  someNewProperty: ''
});

otherObject.someNewProperty = '';

而且..哪一个更快?

谢谢。

Object.assign() 方法用于复制所有 从一个或多个源对象到目标的可枚举自己的属性 对象。它将返回目标对象。

otherObject.someNewProperty = '';是一种直接为对象的某些属性赋值的方法。

显然,Object.assign模式要慢得多:jsperf.com/assign-vs-equals

对于单个属性,直接赋值 ( otherObject.someNewProperty = '' ) 快两倍,但对于多个值 - 时间会增长。每个属性 + 5% 到 10%。此外,代码明智的Object.assign对于多个选项更好。

Object.assign(otherObject, {
  prop1: '',
  prop2: '',
  prop3: '',
  ...
});

otherObject.prop1 = '';
otherObject.prop2 = '';
otherObject.prop3 = '';
...

您只需在Chrome开发工具中运行"配置文件"选项卡并运行一些测试即可。

Object.assign()是一个非常

通用的函数,旨在进行复杂的对象组合。

属性

点表示法是将单个值分配给单个属性的直接方法。

关于哪个更快,考虑到这些不是等价的,这是无关紧要的,正如我一直以来最喜欢的帖子之一所指出的那样,"问哪一个跑得更快可能是不可能的"。

关于直接赋值和使用 Object.asassign 之间的差异,这里还有一件重要的事情要展示(实际上,不完全是区别,但需要注意的重要事情)。

如果你有一个对象被分配给 JS 中的另一个变量,如下所示:

const a = { a: 1 }
const b = a

然后,您决定使用 Object.assign 来更改 a 中的值并分配给另一个变量(d),您也将更改 b 中的值(即使您没有将 Object.assign 返回分配给a,在本例中让我们分配给一个新的变量 d)。

const d = Object.assign(a, { a: 2 })
console.log(a) // { a: 2 }
console.log(b) // { a: 2 }
console.log(d) // { a: 2 }

基本上,重要的是要知道 Object.assign 将改变目标对象以及指向它的所有变量。

现在,如果您直接使用 d 赋值,它不会更改 a 中的值(并且在b也不会更改)。

const d = { ...a, ...{ a: 2 }}
console.log(a) // { a: 1 }
console.log(b) // { a: 1 }
console.log(d) // { a: 2 }

这实际上是一个很好的问题:我们刚刚发现了一个错误,我们将使用 Object.assign 将属性分配给文件。

const file = new File(["foo"], "foo.txt", {
  type: "text/plain",
});
file.name='test'; // does not update the readonly value but doesn't return an error
Object.assign(file,{name:'test'}); // error: 'Cannot set property name of #<File> which has only a getter'