JavaScript对象属性以一种非常有趣的方式得到修改
我做了一个小测试,有人能解释一下为什么JavaScript会做以下事情吗 为什么JavaScript对象属性以一种非常有趣的方式得到修改,javascript,Javascript,我做了一个小测试,有人能解释一下为什么JavaScript会做以下事情吗 为什么testArr会继承newArray的修改 var TestClass = function() { this.testArr = [10,11]; this.addToArray = function() { var newArray = this.testArr; newArray.push(12)
testArr
会继承newArray
的修改
var TestClass = function() {
this.testArr = [10,11];
this.addToArray = function() {
var newArray = this.testArr;
newArray.push(12);
}
}
var testClass = new TestClass();
testClass.addToArray();
console.log(testClass.testArr); // will be [10, 11, 12]
因为它们是同一个数组。变量包含对数组的引用。您正在将该引用分配给一个新变量,现在两个变量都指向同一个数组 下面是一个更简单的测试,它再现了行为:
x = [1, 2] // the value of x is a reference to an array
y = x // the value of y is a reference to the same array
y.push(3) // modify the array pointed to by both variables
console.log(x) // [1, 2, 3]
如果你想创建一个新的数组,你需要。因为它们是同一个数组。变量包含对数组的引用。您正在将该引用分配给一个新变量,现在两个变量都指向同一个数组 下面是一个更简单的测试,它再现了行为:
x = [1, 2] // the value of x is a reference to an array
y = x // the value of y is a reference to the same array
y.push(3) // modify the array pointed to by both variables
console.log(x) // [1, 2, 3]
如果你想创建一个新的数组,你需要使用下面的语句
var newArray = this.testArr;
不会从testArr内部复制值。您将创建对此数组的引用。对引用进行调整时,也会自动更改引用的源
当您想要将值从testArr复制到另一个变量时,您可以这样做
var newArray = this.testArr.slice();
这将从newArray内的testArr中复制值。使用以下语句
var newArray = this.testArr;
不会从testArr内部复制值。您将创建对此数组的引用。对引用进行调整时,也会自动更改引用的源
当您想要将值从testArr复制到另一个变量时,您可以这样做
var newArray = this.testArr.slice();
这将从newArray内部的testArr复制值。我可以做些什么来避免它?真的很有趣,你认为克隆阵列的最佳方法是什么?我在回答中包含了一个链接,非常清楚地解释了这一点。我可以做些什么来避免它?真的很有趣,你认为克隆阵列的最佳方式是什么?我在回答中包含了一个链接,它非常清楚地解释了这一点。