javascript稀疏数组(sparse array)和密集数组用法分析


Posted in Javascript onDecember 28, 2016

本文实例讲述了javascript稀疏数组(sparse array)和密集数组用法。分享给大家供大家参考,具体如下:

学习underscore.js数组相关API的时候,遇到了sparse array这个东西,以前没有接触过。

这里学习下什么是稀疏数组和密集数组。

什么是密集数组呢?在Java和C语言中,数组是一片连续的存储空间,有着固定的长度。加入数组其实位置是address,长度为n,那么占用的存储空间是address[0],address[1],address[2].......address[n-1]。即数组元素之间是紧密相连的,不存在空隙。如下的js代码创建的就是一个密集数组

var data = [3,1,6,9,2];

什么是稀疏数组呢?与密集数组相反,javascript并不强制要求数组元素是紧密相连的,即允许间隙的存在。如下的js代码是合法的:

var sparse = new Array();
sparse[0] = 0;
sparse[3] = 3;
alert(sparse[0]);//输出0
alert(sparse[1]);//输出undefined

1、创建稀疏数组

如下代码创建了一个固定长度的稀疏数组

var a = new Array(3);
a[2] = 1;
alert(a[0]);//undefined
alert(a[2]);//1

说白了js中建立稀疏数组很容易,只要你故意让数组元素之间存在间隙即可。如

var arr = [];
arr[0] = 0;
arr[200] = 200;

2、创建密集数组

可以看到js中的数组一般都是稀疏的,一般来说稀疏数组的遍历比较麻烦。

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

这行代码等同于var  dense = Array(undefined, undefined, undefined) ;呵呵是不是觉得很奇怪,这种方式跟稀疏数组没有什么差别。看代码:

//稀疏数组
var array = new Array(3);
array[2] = "name";
for(var a in array)
{
  console.log("index=" + a + ",value=" + array[a]);
}
// 密集数组
var dense = Array.apply(null, Array(3));
dense[2] = "name";
for(var a in dense)
{
  console.log("index=" + a + ",value=" + dense[a]);
}

用F12观察控制台输出结果是:

javascript稀疏数组(sparse array)和密集数组用法分析

可以看到确实是有差别的:稀疏数组只遍历了一次(因为只有一个元素),密集数组遍历了3次。

3、总结

JavaScript中的数组并不像我们在C或java等语言中遇到的常规数组,在js中数组并不是起始地址+长度构成的一片连续的地址空间。

javascript中数组其实就是个对象,只不过会自动管理一些"数字"属性和length属性罢了。

说的更直接一点,JavaScript中的数组根本没有索引,因为索引应该是数字,而JavaScript中数组的索引其实是字符串。

arr[1]其实就是arr["1"],给arr["1000"] = 1,arr.length也会自动变为1001。

这些表现的根本原因就是:JavaScript中的对象就是字符串到任意值的键值对。

虽然稀疏数组和密集数组差别不大,javascript也没有语法强制数组是稀疏的还是密集的,这不过是概念上的区分。

最佳实践是:就把js数组当成是java或C中的数组,由我们程序员来负责让js的数组元素是连续的。

var array = [1,2,3,4];

如:

var array = new Array();array[0]=0;array[1]=1;

这样创建的js数组,就符合我们熟悉的数组了。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
javascript 广告后加载,加载完页面再加载广告
Nov 25 Javascript
jquery实现页面关键词高亮显示的方法
Mar 12 Javascript
JavaScript实现鼠标滑过图片变换效果的方法
Apr 16 Javascript
在Node.js中使用HTTP上传文件的方法
Jun 23 Javascript
JS实现选择TextArea内文本的方法
Aug 03 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
Jun 08 Javascript
javaScript生成支持中文带logo的二维码(jquery.qrcode.js)
Jan 03 Javascript
angular.js指令中的controller、compile与link函数的不同之处
May 10 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
May 10 Javascript
angularjs实现分页和搜索功能
Jan 03 Javascript
element ui 表格动态列显示空白bug 修复方法
Sep 04 Javascript
js的新生代垃圾回收知识点总结
Aug 22 Javascript
JS中闭包的经典用法小结(2则示例)
Dec 28 #Javascript
AngularJS实现网站换肤实例
Feb 19 #Javascript
详解js树形控件—zTree使用总结
Dec 28 #Javascript
js 轮播效果实例分享
Dec 28 #Javascript
JS正则RegExp.test()使用注意事项(不具有重复性)
Dec 28 #Javascript
Bootstrap 模态框实例插件案例分析
Dec 28 #Javascript
Angular使用ng-messages与PHP进行表单数据验证
Dec 28 #Javascript
You might like
SONY ICF-SW55的电路分析
2021/03/02 无线电
在php中使用sockets:从新闻组中获取文章
2006/10/09 PHP
PHP页面跳转实现延时跳转的方法
2016/12/10 PHP
PHP分享图片的生成方法
2018/04/25 PHP
解决Laravel自定义类引入和命名空间的问题
2019/10/15 PHP
php实现统计IP数及在线人数的示例代码
2020/07/22 PHP
获取网站跟路径的javascript代码(站点及虚拟目录)
2009/10/20 Javascript
JavaScript 利用StringBuffer类提升+=拼接字符串效率
2009/11/24 Javascript
jQuery创建自己的插件(自定义插件)的方法
2010/06/10 Javascript
jQuery.extend()的实现方式详解及实例
2013/06/29 Javascript
easyui Droppable组件实现放置特效
2015/08/19 Javascript
jquery中validate与form插件提交的方式小结
2016/03/26 Javascript
第四章之BootStrap表单与图片
2016/04/25 Javascript
js带闹铃功能的倒计时代码
2016/09/29 Javascript
简单实现JS倒计时效果
2016/12/23 Javascript
js禁止浏览器的回退事件
2017/04/20 Javascript
angularJS 发起$http.post和$http.get请求的实现方法
2017/05/18 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
基于zTree树形菜单的使用实例
2017/12/25 Javascript
微信小程序学习笔记之目录结构、基本配置图文详解
2019/03/28 Javascript
vue接通后端api以及部署到服务器操作
2020/08/13 Javascript
python实现批量获取指定文件夹下的所有文件的厂商信息
2014/09/28 Python
python文件的md5加密方法
2016/04/06 Python
Python实现SSH远程登陆,并执行命令的方法(分享)
2017/05/08 Python
python basemap 画出经纬度并标定的实例
2019/07/09 Python
python之生成多层json结构的实现
2020/02/27 Python
Keras - GPU ID 和显存占用设定步骤
2020/06/22 Python
解析python 类方法、对象方法、静态方法
2020/08/15 Python
解释一下ArrayList Vector和LinkedList的实现和区别
2013/04/26 面试题
大学毕业登记表自我鉴定
2013/10/09 职场文书
4s店机修工岗位职责
2013/12/20 职场文书
班组长工作职责
2013/12/25 职场文书
委托书的写法
2014/09/16 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书
暑假生活随笔
2015/08/15 职场文书
matlab xlabel位置的设置方式
2021/05/21 Python