我在使用javascript时遇到了一个奇怪的问题。我有一个临时变量,我在加载页面时存储了一个值。然后我不得不对某些事件执行一些数据过滤,所以我将它分配给另一个变量并执行过滤器,如下所示:
var myVar = tempVar;
myVar
是一个新变量,最初tempvar
有两个数组元素。过滤后,我将把值赋给myVar
。奇怪的事现在发生了。 myVar
值发生变化时,自动tempVar
值也会发生变化。有人知道为什么会这样吗?如果是这样,你能告诉我如何将变量值分配给另一个变量并在不改变变量值的情况下执行操作吗?
答案 0 :(得分:2)
这是因为您在新变量中创建了对数组的引用,而不是复制它。因此,myVar
和tempVar
都指向同一个变量。
要克隆数组,请使用slice(0)
:
var myVar = tempVar.slice(0);
答案 1 :(得分:0)
如上所述,myVar = tempVar只是将对象引用相互匹配,因此它们共享同一个对象。
如果您希望使用jQuery克隆对象,可以使用jQuery扩展选项
var myVar = jQuery.extend(false, {}, tempVar); // shallow Copy
var myVar = jQuery.extend(true, {}, tempVar); // deep Copy
如果你对objectToCopy的定义是
var tempVar= {
var item1 = 1;
var item2 = 2;
var deeperItem = {
var item3 = 3
}
}
浅拷贝会将第一层数据克隆到myVar中。
对tempVar item1,item2的任何更改都将独立于myVar item1,item2。
但是,任何嵌套对象(如deepItem)仍然会被链接,因此myVar .deeperItem.item3 ='New Value'也会设置myVar .deeperItem.item3
如果你想使用jQuery进行完整克隆,请使用第二种方法,该方法执行深层复制,因此它是一个完全独立的对象。