js数组之稀疏数组和密集数组
2016-04-12 18:22
726 查看
var arr = [];
arr[1] = 1;
和var arr = [undefined, 1];
看似同一数组,但是(0 in arr)及arr.indexOf(undefined)的输出值完全不一样。
所以像取元素在数组中的位置的代码,就要加入
代码如下:
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
代码如下:
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 ]
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。
相关文章推荐
- json文件中的特殊字符处理,放置json数据读取产生错误
- JS的逻辑运算符&& ||
- JavaScript:闭包
- JavaScript获取非行间样式/定义样式
- Javascript模板引擎原理,几行代码的事儿
- jsoup的使用
- JSPatch-使用经验记录
- JavaScript:获取系统当前时间,构造格式化的字符串
- js 二分法查找
- JS求两个数组 差集
- Chrome 的插件JSONView 格式化转换本地的文件
- javascript全局变量与局部变量
- html修改为jsp
- js中的clientWidth offsetWidth scrollWidth等的含义
- 使用js实现全选、反选功能
- 使用Gson解析json数据
- WEB开发:如何用js来模拟服务器的ajax响应,不依赖服务器来编写前端代码
- 可回味的js代码段
- js第三方
- javascript属性方法访问