停止更改影响该对象副本的一个对象参数

时间:2014-10-15 01:04:33

标签: javascript jquery arrays object

假设我有多个阵列。

var array1= [];
var array2= [];
var array3= [];

我有另一个对象数组,每个对象都有一个健康参数。 假设我将此数组中的第一个对象推送到array1,array2和array3。

现在,如果我编辑array1对象的health参数:

array1[0].health -= 50

它会更改每个数组对象的运行状况。我怎么能这样做它只为数组im调用?

3 个答案:

答案 0 :(得分:2)

如果您想要每个数组中的对象副本,并且您不希望修改一个对象影响其他数组,那么您将需要克隆该对象。这篇文章的答案将帮助你解决这个问题:

What is the most efficient way to deep clone an object in JavaScript?

答案 1 :(得分:1)

javascript中的对象是通过引用分配的,因此如果将同一个对象放入两个单独的数组中,则每个数组元素都指向完全相同的对象。

如果你想在每个数组中使用单独的对象,那么你必须为第二个数组显式创建一个新对象(如果那是你想要的话,从第一个对象复制属性)。

在jQuery中,您可以使用$.extend()制作对象的副本。有关两种不同的使用方法,请参阅this answer

或者,在简单的Javascript中,这里是一个生成普通JS对象的浅层副本的函数。

function copyObj(src) {
    var copy = {};
    for (var prop in src) {
        if (src.hasOwnProperty(prop)) {
            copy[prop] = src[prop];
        }
    }
    return copy;
}

答案 2 :(得分:0)

var array1 = []

var array2 = []

array1.health = 50

array2.health = 10

的console.log(array1.health)

  
    

50

  

它仍然是50.另一方面,如果你的问题涉及改变数组元素

var array1 = [0,1]

array1 [0] .health = 50

array1 [1] .health = 10

console.log(array [0] .health)将打印出10因为health是数组对象的属性而不是元素。