首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将()ed推到Array中的对象

将()ed推到Array中的对象
EN

Stack Overflow用户
提问于 2018-09-18 18:55:33
回答 2查看 97关注 0票数 0

当将对象推入数组时,我希望了解以下行为。

(1)创建对象,创建对象的属性,然后将其推到数组中。

代码语言:javascript
运行
复制
var array = [];
var obj = {};

obj.x = 1;
array.push(obj); 
console.log(array); //Output [{x: 1}]

考虑以下两种备选方案:

(2a):我更改对象的属性,从而更改数组中引用的对象:

代码语言:javascript
运行
复制
obj.x = 2;
console.log(array); //Output [{x: 2}] ... it has been changed

(2b而不是2a)我让对象引用引用一个新对象并创建属性,数组中引用的原始对象不变:

代码语言:javascript
运行
复制
obj = {}; //Change reference to new object
obj.x = 2;
console.log(array); //Output [{x: 1}] ... it is unchanged

为什么是这种情况?

P.S:我注意到这里讨论了这个区别(Do objects pushed into an array in javascript deep or shallow copy?),但解释得并不令人满意。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-18 19:19:53

我不知道我可怜的ASCII图表技巧是否会有帮助,但下面是一个尝试:

代码语言:javascript
运行
复制
-----------------------------------------
(1)
-----------------------------------------

array = []

  [ ]    'array'
   ^--------/

obj = {}

  [ ]    'array'   { }     'obj'
   ^--------/       ^-------/

obj.x = 1

  [ ]    'array'   {x: 1}    'obj'
   ^--------/        ^---------/

array.push(obj)

       ,-----------------v
  [0: * ]    'array'   {x: 1}    'obj'
   ^------------/        ^---------/

-----------------------------------------
(2a)
-----------------------------------------

obj.x = 2

       ,-----------------v
  [0: * ]    'array'   {x: 2}    'obj'
   ^------------/        ^---------/


-----------------------------------------
(2b)
-----------------------------------------

obj = {}

       ,-----------------v
  [0: * ]    'array'   {x: 1}    'obj'    { }
   ^------------/                  `-------^ 


obj.x = 2

       ,-----------------v
  [0: * ]    'array'   {x: 1}    'obj'    {x: 2}
   ^------------/                  `--------^ 
票数 0
EN

Stack Overflow用户

发布于 2018-09-18 18:58:44

通过对象引用将JavaScript对象推入数组,也就是说,如果将对象推入数组,然后操作对象,则数组的内容似乎也会发生变化,因为数组引用相同的对象。

通过初始化或克隆附加步骤创建一个新对象,数组中有两个完全不同的对象。

可以这样想:当调用对象上的push时,对象本身不会进入数组,对对象的引用(指针)就会进入。原始类型(如数字)被复制,对象不被复制。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52392962

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档