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