Javascript 如何重新分配对象,使其同时更改引用的对象?

Javascript 如何重新分配对象,使其同时更改引用的对象?,javascript,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", he

假设我有一个对象数组:

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 = {name: "Jack the developer", height: 163};
您正在创建一个新对象并将其分配给
jack
,而不是更改当前对象,例如:

jack.name = "John";
执行此操作时:

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中的情况并非如此。

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

var jack = people[0];    
jack.height = 163;
但是,它仍然“按值”而不是“按引用”赋值,这意味着
jack
保存引用类型(对象)的值,但是如果您重新赋值给
jack
,您只是将一个新的引用值重新赋值给一个新对象


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

按照您的方式使用

演示

const-arr=[
{姓名:“杰克”,身高:163},
{姓名:“玛丽”,身高:170},
{姓名:“苏珊”,身高:162},
] ,
杰克={姓名:“开发商杰克”,身高:163};
分配对象(arr[0],jack);
控制台日志(arr)

.as控制台包装{max height:100%!important;top:0;}
根据您使用

演示

const-arr=[
{姓名:“杰克”,身高:163},
{姓名:“玛丽”,身高:170},
{姓名:“苏珊”,身高:162},
] ,
杰克={姓名:“开发商杰克”,身高:163};
分配对象(arr[0],jack);
控制台日志(arr)

.as控制台包装{max height:100%!important;top:0;}
在JavaScript
中,对象
引用传递和分配so

var jack = people[0];
这里的
jack
people
都是对同一对象的引用

因此在第一种情况下

当您像这样修改值时,
jack.height=163
然后
对象也会得到反射值

在第二种情况下

这一行
jack={name:“jack the developer”,高度:163}

您正在创建一个新的对象完全带有值的
jack
,该值不会反映
对象,这就是为什么您不能在这里获得重新分配的值。

在JavaScript
中,对象
是通过引用传递和分配的

var jack = people[0];
这里的
jack
people
都是对同一对象的引用

因此在第一种情况下

当您像这样修改值时,
jack.height=163
然后
对象也会得到反射值

在第二种情况下

这一行
jack={name:“jack the developer”,高度:163}

您正在创建一个全新的对象完全带有值的
jack
对象,该对象不会反映
对象,这就是您无法获得重新分配的值的原因。

您的可能重复在编辑过程中大大改变了问题的性质。您的可能重复更改了问题的性质与你的编辑有很大关系。没有一种方法可以通过引用来完成作业吗?没有,所有作业都是“按值”完成的。最接近的方法是将每个
people
对象嵌套在另一个对象中,并将该引用类型指定给一个变量。但这似乎不是一个好的解决方案。手头的实际问题是什么?没有办法通过引用来完成赋值吗?没有,所有赋值都是“按值”。最接近的方法是将每个
people
对象嵌套在另一个对象中,并将该引用类型指定给一个变量。但这似乎不是一个好的解决方案。手头的实际问题是什么?谢谢,
Object.assign(newjack,jack)
是我想要的。顺便说一句,
find
是不必要的,
let
const
即使是
var也可以
Object.assign
就可以了。因为您使用的是
people[0]
所以您可以轻松地使用Object.assign()。请参阅更新的答案。@SHAPHOP:请注意,这不会处理您希望删除属性的情况。这并不是一种神奇的方法,它可以为您提供所需的功能。这只是为了方便将一个对象的属性分配给另一个对象。谢谢,
object.assign(newjack,jack)
正是我想要的。顺便说一句,
find
不是必需的,也不是
let
const
即使是
var
也可以
Object.assign
就可以了。因为您使用的是
people[0]
所以您可以轻松地使用Object.assign()。请参阅更新的答案。@SHAPHOP:请注意,这不会处理您希望删除属性的情况。Th