假设我有一个对象数组:
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];
这里jack
和people
都是对同一对象的引用。
所以在第一种情况下,
当您像这样修改值时jack.height = 163
people
对象也会获得反射值。
在第二种情况下,
有了这条线jack = {name: "Jack the developer", height: 163};
您正在创建一个全新的对象jack
具有新值,该对象不会反映people
对象,这就是为什么在这里您没有获得重新分配的值的原因。