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. undefineda.map(function (x, i) { return i })
[ 0, 1, 2 ]
ps:鉴于个人经验有限,所有观点,如有异议,请直接回复讨论(请勿发表攻击言论)。
加入QQ群209952809(需回答问题,答案为csdn);群聊更快解决问题,更happy。