JavaScript对象属性以一种非常有趣的方式得到修改

JavaScript对象属性以一种非常有趣的方式得到修改,javascript,Javascript,我做了一个小测试,有人能解释一下为什么JavaScript会做以下事情吗 为什么testArr会继承newArray的修改 var TestClass = function() { this.testArr = [10,11]; this.addToArray = function() { var newArray = this.testArr; newArray.push(12)

我做了一个小测试,有人能解释一下为什么JavaScript会做以下事情吗

为什么
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复制值。

我可以做些什么来避免它?真的很有趣,你认为克隆阵列的最佳方法是什么?我在回答中包含了一个链接,非常清楚地解释了这一点。我可以做些什么来避免它?真的很有趣,你认为克隆阵列的最佳方式是什么?我在回答中包含了一个链接,它非常清楚地解释了这一点。