gpt4 book ai didi

javascript - 'Object.assign' 在更深层次上改变状态

转载 作者:行者123 更新时间:2023-12-03 08:29:36 24 4
gpt4 key购买 nike

我在 http://jsbin.com/givolafala/edit?html,js,console,output 有一个示例 JSBin 代码

var oldObject = { name: 'John', address: { city: 'new york'}};

var newObject = Object.assign({}, oldObject);

console.log(oldObject);
console.log(newObject);

newObject.name = 'Mathew';
newObject.address.city = 'los angeles';

console.log(oldObject);
console.log(newObject);

在此示例中,我将顶层的 nameJohn 更改为 MathewObject.assign 返回具有新名称 Mathew 的新状态。 oldObject 保留其先前的值 John

如果我在除根之外的任何级别更改任何值,它都不起作用。在示例中,我将城市更改为 los angeles,您会注意到 newObjectoldObject 具有相同的城市 los安吉利斯。所以 oldObject 状态发生了变化。

这是一个错误吗?

最佳答案

这不是bug,这叫引用。原始值和对象(实际上对对象的引用)的行为方式有所不同。

var oldObject = { name: 'John', address: { city: 'new york'}};

oldObject 包括:

  • name 是一个字符串value(原始)
  • addres 是一个对象,所以 oldObject 确实有一个 referenceaddress 对象

现在:

var newObject = Object.assign({}, oldObject);

复制newObject后还有namevalueaddressreference

newObject.name = 'Mathew';

在这里,您更改了 newObject 的属性值。

newObject.address.city = 'los angeles';

但在这里您更改了 newObject references 的对象的属性。但是这个引用也在 oldObject 中,所以这也会改变 oldObject

基本上 newObjectoldObject 都有一个对同一个 address 对象的引用

您期望实现的目标称为深层复制

关于javascript - 'Object.assign' 在更深层次上改变状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37429095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com