每当我尝试更改数组y中的第一个对象时,我的数组中的所有其他对象y属性也会发生变化,是否有任何方法可以防止这种情况,或者将多个对象添加到共享相同对象的数组中物业? 我一直在尝试一切来解决这个问题(我正在创建一个游戏,使用类似的阵列进行子弹射击,每当我更改数组中第一个项目的y属性时,数组中所有其他y属性都随之改变)和我认为这可能是问题?
parseMembersFromArray
答案 0 :(得分:2)
您可以通过在.push()中定义一个对象来解决此问题。
这为数组的每个元素创建一个新对象,而不是包含对同一对象的多个引用的数组。
var arr = [];
for(var i = 0;i<3;i++) {
arr.push({x:30, y:20});
}
arr[0].y = 40;
document.write(arr[0].y + " " + arr[1].y);
答案 1 :(得分:0)
你正在制作一个obj
并在数组中传递对同一个对象的引用4次
相反,您可以尝试在每次迭代中创建新对象:
var arr = [];
for(var i = 0;i<3;i++) {
arr.push({x:30,y:20});
}
arr[0].y = 40;
document.write(arr[0].y + " " + arr[1].y);
您还可以查找各种方法来克隆&#34;一个东西。 angular,jquery和underscore都提供了这样做的方法,或者你可以查看How to clone js object?
答案 2 :(得分:0)
除了@IrkenInvader给出的答案,您还可以使用对象的jQuery to very easily perform a deep-copy:
var obj = {x: 30, y: 20};
var arr = [];
for(var i = 0; i < 3; i++) {
arr.push(jQuery.extend(true, {}, obj));
}
arr[0].y = 40;
document.write(arr[0].y + " " + arr[1].y);
答案 3 :(得分:0)
在JavaScript中,对象作为指向对象内部值的指针存储在内存中。这与原始数据类型(int
,char
等)
显示此功能的一个好方法是尝试打印出对象,然后打印出int
:
的 HTML:强>
<div id="anelementhere"></div>
<div id="anotherelementhere"></div>
<强> JS:强>
var x = 5;
var obj = {x:30,y:20};
document.getElementById("anelementhere").innerHTML = x;
document.getElementById("anotherelementhere").innerHTML = obj;
JSFiddle:https://jsfiddle.net/d3ohpqqp/
您应该能够看到类似于:
的内容5
[object Object]
现在,知道这一点,数组中存储的内容不是{{x:30, y:20}, {x:30, y:20}, {x:30, y:20}}
,而是{[object Object], [object Object], [object Object]}
,它们都指向 ONE {x:30, y:20}
这是更改后所有y
属性发生变化的原因。现在这是一个简单的解决方案,正如@IrkenVader所示,当您将对象放入阵列时,可以初始化对象。
但是,如果由于某种原因你仍然想要在数组之外的原始对象,这是另一种解决方案:
var obj = {x:30,y:20};
var arr = [];
for(var i = 0;i<3;i++) {
arr.push({x:obj.x, y:obj.y});
}
arr[0].y = 40;
document.write(arr[0].y + " " + arr[1].y);
JSFiddle:https://jsfiddle.net/9gzyr38x/