【问题标题】:Javascript Array.push()Javascript Array.push()
【发布时间】:2015-08-20 04:32:33
【问题描述】:

我是 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

我的想法有什么不对吗?另外,如何在继续获取array.length = 3的同时获取this.array.length = 2;

附:您还可以在JSFiddle 中查看此运行代码。

【问题讨论】:

    标签: javascript arrays object prototype this


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      如果你想处理this.array副本,你应该这样做

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

      相反。您应该知道,即使这种方法也只会在 one 级别生成 new 数组元素。如果您使用的是数组数组,那么 inside 数组(或任何其他对象)将再次成为指向原始数组的 pointers

      【讨论】:

      • 感谢提醒...但只是补充一下我从另一篇文章中看到的,stackoverflow.com/questions/7486085/… 此方法仅适用于数组中的数字和字符串,但不适用于对象数组。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 2021-07-11
      • 2012-02-03
      • 2013-03-17
      相关资源
      最近更新 更多