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

时间:2018-05-04 15:57:14

标签: javascript

我们说我有一系列对象:

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以便更改引用?

4 个答案:

答案 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()

<强>样本

&#13;
&#13;
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;
&#13;
&#13;

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

<强>样本

&#13;
&#13;
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;
&#13;
&#13;

答案 3 :(得分:0)

在JavaScript中objects传递并由引用分配

var jack = people[0];

此处jackpeople都是对同一对象的引用。

所以在第一种情况下

当您修改此值jack.height = 163时,people对象也会获得反映值。

第二种情况

使用此行jack = {name: "Jack the developer", height: 163}; 您正在使用值创建完全新对象jack,这不会反映people对象的原因你没有得到重新分配的价值。