如何重新分配对象,以便它也更改引用的对象?



假设我有一个对象数组:

var people = [
{name: "Jack", height: 180},
{name: "Marry", height: 170},
{name: "Susan", height: 162},
]

如果我取第一人称并像这样改变高度:

var jack = people[0];     
jack.height = 163;

然后,此更改也会反映在数组中的对象中,如下所示:

people = [
{name: "Jack", height: 163},
{name: "Marry", height: 170},
{name: "Susan", height: 162},
] 

但是,如果我像这样重新分配对象

jack = {name: "Jack the developer", height: 163}

数组不会更改:

people = [
{name: "Jack", height: 163},
{name: "Marry", height: 170},
{name: "Susan", height: 162},
] 

我应该如何分配jack以更改引用?

按照您的方式,您可以使用Object.assign()

演示

const arr=[
{name: "Jack", height: 163},
{name: "Marry", height: 170},
{name: "Susan", height: 162},
] ,
jack = {name: "Jack the developer", height: 163};

Object.assign(arr[0],jack);
console.log(arr);
.as-console-wrapper {max-height: 100% !important;top: 0;}


您还可以使用数组find方法并使用 Object.assign(( 合并新值。

演示

const arr=[
{name: "Jack", height: 163},
{name: "Marry", height: 170},
{name: "Susan", height: 162},
] ,
jack = {name: "Jack the developer", height: 163};

let result = arr.find(({name})=>name=="Jack");
if(result){
Object.assign(result,jack);
};
console.log(arr);
.as-console-wrapper {max-height: 100% !important;top: 0;}

当你这样做时:

jack = {name: "Jack the developer", height: 163};

您正在创建一个新对象并将其分配给jack,而不是更改当前对象,例如:

jack.name = "John";

JS 确实有引用类型,这就是此代码工作的原因:

var jack = people[0];    
jack.height = 163;

但是,它仍然"按值"而不是"按引用"进行赋值,这意味着jack保存引用类型(对象(的值,但如果重新分配给jack,则只是将新的引用值重新分配给新对象。

如果 JS 具有"通过引用"赋值,那么您的代码将起作用,因为jack将引用数组中对象的原始位置,从而允许您使用jack就像使用该数组索引一样。在JS中并非如此。

在 JavaScript 中,objects通过引用传递和赋值,因此

var jack = people[0];

这里jackpeople都是对同一对象的引用。

所以在第一种情况下

当您像这样修改值时jack.height = 163people对象也会获得反射值。

在第二种情况下

有了这条线jack = {name: "Jack the developer", height: 163};您正在创建一个全新的对象jack具有值,该对象不会反映people对象,这就是为什么在这里您没有获得重新分配的值的原因。

相关内容

最新更新