3

我已经编写了将其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**
4

2 回答 2

3

您的问题arguments不是数组,而是某种数组,例如集合。您可以将其转换为这样的数组this.arrvar = Array.prototype.slice.call(arguments, 0);

于 2013-03-24T08:03:01.433 回答
1

我看不到这个ArrayClass功能的任何用途。为什么不直接使用原生 javascriptArray对象?无论如何,您的代码可以短得多,例如(替换document.writeconsole.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演示了这一点,使用 native 演示了相同的Array

于 2013-03-24T08:08:06.530 回答