Javascript Array.push()

时间:2015-08-20 04:32:34

标签: javascript arrays object prototype this

我是Javascript的新手,现在遇到了Array.push上的一个问题,原型就是这个问题。

这是我的代码:

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

P.S。您还可以在JSFiddle中查看此运行代码。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

您有效地设置了指向this对象属性的指针。所以,你看似所做的一切}你实际array做了什么。

如果您想处理this.array副本,您应该

this.array

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