我创建了一个带有一些值的对象数组。然后我创建了另一个对象数组并用第一个对象数组进行初始化。然后我在第二个数组中推送了一个值,并且控制台记录了两个数组。两个数组都具有相同的值。为什么会发生这种情况?我们如何阻止这种情况?
我的代码:
var a = { "filters": [] }; // 1st object array
var keyValue = {};
// pushed 2 values in "a" array
keyValue["abc"] = "123";
a.filters.push(keyValue);
keyValue["def"] = "456";
a.filters.push(keyValue);
var b = a; // created another object array & initialized it with "a" array
var keyValue1 = {};
// pushed 1 value in "b" array
keyValue1["ghi"] = "789";
b.filters.push(keyValue1);
console.log(a);
console.log(b);
这会打印a和b的相同值 如何在不更新第一个数组的情况下将值推入第二个数组?
答案 0 :(得分:1)
对象的var b = a
分配会创建一个对象' b'它通常引用(就像指针一样)指向' a'的相同位置。您可能会发现此link有用。
但是,您可以使用切片方法创建/克隆新数组。 var b = a.slice()
答案 1 :(得分:0)
当你说:
时,两者都指向内存中的相同值var b = a;
因此,如果您更改a,b将受到影响,反之亦然,您需要使用循环进行复制。
修改强>
使用我从this post
获得的这行代码var b= a.slice(0);
答案 2 :(得分:0)
答案 3 :(得分:0)
在JavaScript中(与大多数语言一样)asigment它是别名:
var b = a;
不制作副本。
要制作副本,您必须重新创建对象:
var b = Object.create(a); // clone... a is used as protype
// filters points to the same value in memory
一种选择是创建新的过滤器副本:
var b = Object.create(a);
b.filters = a.filters.slice();
另一种看似效率不高的“hacky”选项:
var b = JSON.parse(JSON.stringify(a));