新Array(20)的实际功能

what new Array(20) actually do

本文关键字:功能 Array      更新时间:2023-09-26

这里我有一个Store构造函数,它有一个名为arr的属性,它是使用新的Array(height*width)创建的,提供的高度和长度作为参数发送给Store构造函数。我所知道的是,新的Array(20)将创建一个可以包含20个元素的数组。

Store构造函数有一个原型属性,该属性使用映射数组并填充新Store实例的this.arr。

但令人惊讶的是,在填充过程之后,数组长度得到了扩展。它变成了40。我知道push方法在数组的末尾插入元素。这是否意味着数组已经有20个元素但它应该是空的,对吗??我很困惑!!!

var map=['d d d d d ',
         'e e e e e ']
function Store(width,height){
    this.width=width;
	this.height=height;
	this.arr=new Array(this.width*this.height);
}
Store.prototype.set=function(map){
    for(i=0;i<this.height;i++){
	    for(j=0;j<this.width;j++){
		    this.arr.push(map[i][j]);
		}
	}
}
var store=new Store(map[0].length,map.length);
document.write('previously : '+store.arr.length+'</br>');
store.set(map);
document.write('now : '+store.arr.length);

使用Array构造函数创建数组时,它会创建指定长度的稀疏数组。因此,当你说Array(20)时,它已经创建了一个数组,其中有20个元素(通过更改length属性),这些元素还没有定义。所以,假设长度设置为5,并且你试图访问0处的元素。现在,JavaScript将在Array对象中查找属性0,但找不到任何内容。因此,它将返回undefined。但是,当您执行类似array[0] = 1的操作时,它会指定属性0,即值1。因此,下次查找array[0]时,它将返回1。实际上,当你简单地创建一个数组时,里面什么都没有

关于push,引用MDN的Array.prototype.push

push()方法将一个或多个元素添加到数组的末尾,并返回数组的新长度。

所以,每当你向它推东西的时候,它一直在扩展数组

this.arr[i][j] = map[i][j];

new Array(20)创建一个包含20个未定义元素的数组。但是阵列中的存储是预先分配的。这被认为是处理数组的一种更有效的方式。如果您提前知道数组长度,请始终使用此方法。(顺便说一句,让阵列的所有元素都是同一类型更有益)

如果你预先分配了一个数组,不要向它推送元素。给数组中的元素赋值,如下所示:

var map=['d d d d d ',
         'e e e e e ']
function Store(width,height){
    this.width=width;
	this.height=height;
	this.arr=new Array(this.width*this.height);
}
Store.prototype.set=function(map){
    for(i=0;i<this.height;i++){
	    for(j=0;j<this.width;j++){
		    this.arr[i*j+j] = map[i][j];
		}
	}
}
var store=new Store(map[0].length,map.length);
document.write('previously : '+store.arr.length+'</br>');
store.set(map);
document.write('now : '+store.arr.length);

如果您事先不知道数组的大小,请创建一个空的零长度数组,并将push(或unshiftpush将元素放在数组的最后一个位置,unshift将元素放到数组的第一个0索引位置)元素添加到其中。这样做的速度较慢,因为每次推送或取消推送都会动态更改数组的大小。