新Array(20)的实际功能
what new Array(20) actually do
这里我有一个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
(或unshift
,push
将元素放在数组的最后一个位置,unshift
将元素放到数组的第一个0索引位置)元素添加到其中。这样做的速度较慢,因为每次推送或取消推送都会动态更改数组的大小。
- 添加文字和评论功能更新Div
- JavaScript打印功能使日历停止工作
- 如何为json对象中的段发送array[]
- 每当您在选择器内移动鼠标时,悬停功能就会重复
- 如何防止网页加载后自动启动功能
- 除修剪外的其他功能
- 悬停功能触发器
- 使用angularjs向浏览器发送servlet响应(下载功能)
- Array.length似乎不起作用;console.log则显示其他情况
- 删除CKEditor工具栏按钮,但不删除功能
- 异步facebook功能
- 如何迭代Array.prototype函数
- 如何将chrome扩展功能移植到移动设备(特别是jquery和trello)
- Javascript 新的 Array 和 join() 方法
- jQuery滚动功能只工作一次
- Array.lenght = undefined
- 新Array(20)的实际功能
- 从对列表中获取JSON值作为Array(用于自动完成功能)
- 扩展常规对象以支持ES5 Array功能的问题
- 如何在不使用原型的情况下获得Object/Array.prototype的功能