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

3
我写了一个函数,将其arrvar变量设置为接收到的参数。然后我添加了一些方法到该函数中:
  • setArray: 将参数添加到arrvar的末尾
  • showArray: 输出数组arrvar
  • showArrayType: 输出数组arrvar的类型(始终为对象)
  • showLength: 输出数组arrvar的长度
问题在于,当我调用setArray()时,arrvar的长度不会增加,如下所示。为什么会这样?
    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个回答

3

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


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演示了相同的内容。


是的,这不是最终代码,我知道从上面的摘录中这个函数没有具体意义,因为我已经将代码剥离到需要的部分来解释问题 :p - Mahesha999

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接