我们说我有一系列对象:
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
以便更改引用?
答案 0 :(得分:1)
执行此操作时:
jack = {name: "Jack the developer", height: 163};
您正在创建一个新对象并将其分配给jack
,而不是更改当前对象,例如:
jack.name = "John";
答案 1 :(得分:1)
JS确实有引用类型,这就是这段代码的工作原理:
var jack = people[0];
jack.height = 163;
但是,它仍然按“值”而不是“按引用”进行分配,这意味着jack
保存引用类型(对象)的值但是如果< em>重新分配到jack
,您只需将新参考值重新分配给新对象。
如果JS通过“引用”进行了分配,那么您的代码将起作用,因为jack
将引用数组中对象的原始位置,允许您使用jack
,就像您一样正在使用该数组索引。 JS的情况并非如此。
答案 2 :(得分:1)
根据您的方式,您可以使用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);
&#13;
.as-console-wrapper {max-height: 100% !important;top: 0;}
&#13;
您还可以使用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);
&#13;
.as-console-wrapper {max-height: 100% !important;top: 0;}
&#13;
答案 3 :(得分:0)
在JavaScript中objects
传递并由引用分配
var jack = people[0];
此处jack
和people
都是对同一对象的引用。
所以在第一种情况下,
当您修改此值jack.height = 163
时,people
对象也会获得反映值。
,
使用此行jack = {name: "Jack the developer", height: 163};
您正在使用新值创建完全新对象jack
,这不会反映people
对象的原因你没有得到重新分配的价值。