您的位置:首页 > Web前端 > JavaScript

js数组之稀疏数组和密集数组

2016-04-12 18:22 726 查看
var arr = [];

arr[1] = 1;

和var arr = [undefined, 1];

看似同一数组,但是(0 in arr)及arr.indexOf(undefined)的输出值完全不一样。

所以像取元素在数组中的位置的代码,就要加入
i in arr
的判断:

inArray: function( elem, arr, i ) {
var len;

if ( arr ) {
if ( core_indexOf ) {
return core_indexOf.call( arr, elem, i );
}

len = arr.length;
i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;

for ( ; i < len; i++ ) {
// 跳过稀疏数组中的元素
if ( i in arr && arr[ i ] === elem ) {
return i;
}
}
}

return -1;
},


测试代码:

var arr = [undefined, 1];

console.dir(arr); //[undefined, 1]
console.log("0 in arr==" + (0 in arr)); // true;
console.log("arr.indexOf(undefined)==" + arr.indexOf(undefined)); // 0;
console.log("arr[0] ==" + arr[0]); //  undefined;

但是如果是以下代码:
var arr = [];
arr[1] = 1;

console.dir(arr); //[undefined, 1]
console.log("0 in arr==" + (0 in arr)); // false;
console.log("arr.indexOf(undefined)==" + arr.indexOf(undefined)); // -1;
console.log("arr[0] ==" + arr[0]); //  undefined;


1.稀疏数组

创建一个指定长度的稀疏数组很简单:

代码如下:

var a = new Array(3);

a

[ , , ]

a.length

3

a[0]

undefined

当你遍历它时,你会发现,它并没有元素.JavaScript会跳过这些缝隙.

代码如下:

a.forEach(function (x, i) { console.log(i+”. “+x) });

a.map(function (x, i) { return i })

[ , , ]

还有一些其他情况会生成稀疏数组,比如

代码如下:

var arr = [];

arr[0] = 0;

arr[100] = 100>a.forEach(function (x, i) { console.log(i+”. “+x) });0. 0100. 100

2.密集数组

Brandon Benvie 最近在es-discuss邮件讨论组中提到了一个创建密集数组的技巧:

代码如下:

var a = Array.apply(null, Array(3));

a

[ undefined, undefined, undefined ]

上面的语句其实等同于:

Array(undefined, undefined, undefined)

但从表面上看,貌似这个数组和之前的稀疏数组并没有太多的区别:

代码如下:

a.length

3

a[0]

undefined

可是,你现在可以遍历到这些数组元素了,还可以为每个元素重新赋值:

代码如下:

a.forEach(function (x, i) { console.log(i+”. “+x) });

0. undefined

1. undefined

2. undefined

a.map(function (x, i) { return i })

[ 0, 1, 2 ]

ps:鉴于个人经验有限,所有观点,如有异议,请直接回复讨论(请勿发表攻击言论)。
加入QQ群209952809(需回答问题,答案为csdn);群聊更快解决问题,更happy。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: