我发现了一个非常奇怪(对我而言)的问题
我有这个全局变量ARRAY
var A = [1,2,3,4]
然后在函数内部,我创建了局部变量并将之前的全局变量分配给它
function someFunc() {
var X = A;
}
然后我创建了另一个本地Var并为其赋予第一个本地var值
var Y = X;
然后我将一个新值推送到Y
Y.push(6);
但是,新值(6)并没有推到Y,而是推到了2个原始数组(X和A)。发生了什么?它不应该只改变Y吗?
请帮助,谢谢。
这是我的完整代码:
var A = [1,2,3,4];
function someFunc(){
var X = A;
var Y = X;
Y.push(6);
console.log(A);
console.log(X);
console.log(Y);
}
$("#test").click(function(){
someFunc();
});
如您所见,它是通过单击id为#test。
的元素触发的所有三个console.log,甚至认为代表不同的变量,它返回相同的结果,ARRAY上有6个
编辑。是的,有一个类似的问题,但即使问题是相似的,解决方案是相同的,但最初的理解是不同的。在我的问题中,我最初问过"为什么",因为我实际上并不知道这些变量'引用'相同的数组而不是'分配',所以我不知道我是否应该搜索如何分配而不是引用,因为我假设使用=
意味着分配,抱歉
答案 0 :(得分:1)
发生的事情是你不复制你刚引用的数组。您可以使用方法slice创建它的副本:
var X = A.slice();
请注意,您只能将此方法用于原始值。如果您需要处理对象How do you clone an Array of Objects in Javascript?
,请检查此项答案 1 :(得分:0)
您的阵列未被克隆:分配变量不会克隆基础对象。
您可以使用切片方法对数组进行浅层克隆:
var cloned = original.slice();
但是使用此方法不会克隆数组中的数组和对象项。但是,克隆了数字和字符串,所以这应该适用于您的情况。
答案 2 :(得分:0)
JavaScript中的数组也是一个对象,变量只保存对象的引用,而不是对象本身。因此,两个变量都引用同一个对象。