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

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。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值