对象实例的数组长度大于提供的参数

时间:2014-08-19 19:39:42

标签: javascript arrays

这里有三个构造函数Person,Books,Library.Now for Library part我发送两个实例作为参数我用book构造函数创建了。一切都好但问题是我只发送了两个参数

var newlib=new Library(storyBook,horrorBook);

问题出在这一部分:

function Library(){
   this.book=new Array(arguments.length);
       console.log('length of book array : '+this.book.length);
       console.log('argument length : '+arguments.length);
   for(var i=0;i<arguments.length;i++){
       this.book.push(arguments[i]);


   }

   this.getbookslist=function (){

   for(var i=0;i<this.book.length;i++){
      document.body.innerHTML+=this.book[i].name+'</br>';
   }
}
}

var newlib=new Library(storyBook,horrorBook);
console.log('newlib book list length : '+newlib.book.length);

但是控制台告诉我newlib.book.length的数组长度为4.而this.book的长度为2.这可能是导致此问题的原因。

<html>
<body>
<script>

function Person(lastname,firstname){
  this.lastname=lastname;
  this.firstname=firstname;
  this.fullname=this.firstname+' '+this.lastname;
}
var mrX=new Person("X","mr");
var mrY=new Person('Y','mr');
var mrZ=new Person('Z','mr');

function Book(name,price,page){
    this.name=name;
    this.price=price;
    this.page=page;
    this.author=new Array(arguments.length-3);
    for(var i=0;i<arguments.length-3;i++){
        this.author[i]=arguments[i+3];

    }

}
var storyBook=new Book('story','200','60',mrX);
var horrorBook=new Book('horror ','100','50',mrY,mrZ);
function Library(){
   this.book=new Array(arguments.length);
       console.log('length of book array : '+this.book.length);
       console.log('argument length : '+arguments.length);
   for(var i=0;i<arguments.length;i++){
       this.book.push(arguments[i]);


   }

   this.getbookslist=function (){

   for(var i=0;i<this.book.length;i++){
      document.body.innerHTML+=this.book[i].name+'</br>';
   }
}
}

var newlib=new Library(storyBook,horrorBook);
console.log('newlib book list length : '+newlib.book.length);


</script>
</body>
</html>

1 个答案:

答案 0 :(得分:2)

这里的问题是您致电new Array(arguments.length)。这会使用length 2初始化一个空数组。 push方法根据数组的当前length值插入值。

考虑这个简单的例子:

var a = new Array(2);
a.push("foo");
console.log(a);

这会记录[undefined, undefined, "foo"](或[undefined x 2, "foo"],具体取决于您的浏览器)。 push操作在索引2执行插入,因为这是执行length时数组的push

而是通过执行0或(甚至更好)new Array()来初始化一个初始长度为[]的数组。