向数组添加元素不会增加其长度

时间:2013-03-24 07:51:10

标签: javascript arrays

我编写了函数,它将arrvar变量设置为接收到的参数。 然后我为该函数添加了一些方法:

  • setArray:将参数添加到arrvar
  • 的末尾
  • showArray:输出数组arrvar
  • showArrayType:输出数组类型arrvar(始终为对象)
  • showLength:输出数组arrvar
  • 的长度

这里的问题是,当我调用arrvar时,setArray()的长度不会增加,如下所示。为什么会这样?

    function ArrayClass()
    {            
        if (arguments.length != 0) {
            this.arrvar = arguments;
        }        
    }

    ArrayClass.prototype.setArray = function () {
        for (var i = this.arrvar.length, j = 0; j < arguments.length; i++, j++)
        {
            this.arrvar[i] = arguments[j];                
        }            
    }

    ArrayClass.prototype.showArray = function ()
    {
        for (var i in this.arrvar) {
            document.writeln(this.arrvar[i]+'  ');
        }
        document.writeln("<br />");
    }

    ArrayClass.prototype.showArrayType = function ()
    {
        document.writeln(typeof this.arrvar + '<br />');
    }

    ArrayClass.prototype.showLength = function()
    {
        if (this.arrvar) {
            document.writeln('Length: ' + this.arrvar.length + "<br />");
        }
    }

    var arrObj = new ArrayClass(11, 22, 33, 44);
    arrObj.showArray();  //11  22  33  44
    arrObj.showArrayType();  //object
    arrObj.showLength();  //4
    arrObj.setArray(55, 66, 77); 
    arrObj.showArray();   //11  22  33  44  55  66  77
    arrObj.showArrayType();  //object
    arrObj.showLength();  //**4**

2 个答案:

答案 0 :(得分:3)

你的问题是arguments不是一个数组,它是某种类似数组的集合。您可以将其转换为类似this.arrvar = Array.prototype.slice.call(arguments, 0);的数组。

答案 1 :(得分:1)

我不会看到使用此ArrayClass函数。为什么不使用原生javascript Array对象?无论如何,你的代码可以短得多,例如(在document.write替换console.log):

function ArrayClass(){            
   this.arrvar = [].slice.call(arguments) || [];
}

ArrayClass.prototype.setArray = function () {
   this.arrvar = this.arrvar.concat([].slice.call(arguments));
}

ArrayClass.prototype.showArray = function() {
   for (var i=0;i<this.arrvar.length;i+=1) {
    console.log(this.arrvar[i]);
   }
}

ArrayClass.prototype.showArrayType = function()  {
    console.log(typeof this.arrvar + '<br />');
}

ArrayClass.prototype.showLength = function() {
    console.log('Length: ' + this.arrvar.length);
}

JsFiddle演示了这一点,使用原生Array展示了相同内容。