Javascript Array.push()

Javascript Array.push()

本文关键字:push Array Javascript      更新时间:2023-09-26

我是Javascript新手,现在在Array上遇到了一个问题。Push和this在prototype.

下面是我的代码:
function Ball(array) {
    this.array = array; 
}
Ball.prototype.allArray = []; // this is a property shared among ALL Ball object, though here I just create one object... 
Ball.prototype.addArray = function() {
    this.allArray.push(12); 
}
Ball.prototype.changeArray = function() {
    var array = this.array; 
    var allArray = this.allArray; 
    for (var i = 0; i < allArray.length; i++) {
        array.push(allArray[i]); 
    }
    // Array.prototype.push.apply(array, allArray); // same result as above 
    alert(array.length); // 3 Expected
    /*         PROBLEM          */
    alert(this.array.length); // 3, expected 2 Why 3? We just change array NOT this.array... 
}
var ball = new Ball([123, 198]); 
ball.addArray(); 
ball.changeArray(); 

如上述代码所述,我有一个问题,为什么是this.array.length = 3,而不是2

changeArray方法中,我一直只改变数组值,而不是array.length。这意味着this.array的值应该保持不变。因此,this.array.length应该是2

我的想法有什么不对吗?此外,我怎么能得到this.array.length = 2;,而继续得到array.length = 3 ?

注:您还可以查看JSFiddle中正在运行的代码。

this.array;//在changeArray()内部指向与传递给new Ball([123, 198])的相同的数组;

var array = this.array;//这使得数组指向同一个数组。所以对数组的改变也会改变你的数组

With

 var array = this.array; 
 var allArray = this.allArray; 

可以有效地设置指向this对象属性的指针。所以,所有你用array做的事情,其实都是用this.array做的。

如果你想在this.array复制,你应该做

var array=this.array.slice(0);

。您应该知道,即使这种方法也只会在一个级别上生成新的数组元素。如果您使用的是数组的数组,那么数组(或任何其他对象)内部的将再次只是指向原始数组的指针。