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的匿名函数来分析几段简单有趣的代码
Jun 29 Javascript
固定背景实现的背景滚动特效示例分享
May 19 Javascript
js实现的全国省市二级联动下拉选择菜单完整实例
Aug 17 Javascript
jQuery热气球动画半透明背景的后台登录界面代码分享
Aug 28 Javascript
JS实现的颜色实时渐变效果完整实例
Mar 25 Javascript
JavaScript易错知识点整理
Dec 05 Javascript
详解Weex基于Vue2.0开发模板搭建
Mar 20 Javascript
JS+HTML实现的圆形可点击区域示例【3种方法】
Aug 01 Javascript
Vue项目查看当前使用的elementUI版本的方法
Sep 27 Javascript
小程序scroll-view安卓机隐藏横向滚动条的实现详解
May 16 Javascript
AngularJS实现的鼠标拖动画矩形框示例【可兼容IE8】
May 17 Javascript
详解TypeScript中的类型保护
Apr 29 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
Smarty模板快速入门
2007/01/04 PHP
php 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
php+jQuery.uploadify实现文件上传教程
2014/12/26 PHP
php获取客户端电脑屏幕参数的方法
2015/01/09 PHP
分享php邮件管理器源码
2016/01/06 PHP
PHP数学运算与数据处理实例分析
2016/04/01 PHP
PHP执行shell脚本运行程序不产生core文件的方法
2016/12/28 PHP
PHP实现的折半查询算法示例
2017/10/09 PHP
JS操作XML中DTD介绍及使用方法分析
2019/07/04 PHP
php实现快速对二维数组某一列进行组装的方法小结
2019/12/04 PHP
如何实现星星评价(jquery.raty.js插件)
2016/12/21 Javascript
Bootstrap中datetimepicker使用小结
2016/12/28 Javascript
js实现随机数字字母验证码
2017/06/19 Javascript
解决vue项目打包后提示图片文件路径错误的问题
2018/07/04 Javascript
基于vue--key值的特殊用处详解
2020/07/31 Javascript
[42:48]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第二场 12.11
2020/12/16 DOTA
Python数据结构与算法之图的广度优先与深度优先搜索算法示例
2017/12/14 Python
python计算两个地址之间的距离方法
2018/06/09 Python
Python利用ORM控制MongoDB(MongoEngine)的步骤全纪录
2018/09/13 Python
Python交互环境下打印和输入函数的实例内容
2020/02/16 Python
python实现猜拳游戏
2020/03/04 Python
Django User 模块之 AbstractUser 扩展详解
2020/03/11 Python
pytorch 中的重要模块化接口nn.Module的使用
2020/04/02 Python
pandas中的ExcelWriter和ExcelFile的实现方法
2020/04/24 Python
python中setuptools的作用是什么
2020/06/19 Python
python实现学生通讯录管理系统
2021/02/25 Python
美国最大的在线水培用品商店:GrowersHouse.com
2018/08/14 全球购物
泰国在线书店:SE-ED
2020/06/21 全球购物
师范大学生求职信
2014/06/13 职场文书
公司授权委托书范文
2014/08/02 职场文书
2016年秋季趣味运动会开幕词
2016/03/04 职场文书
使用pytorch实现线性回归
2021/04/11 Python
Python使用protobuf序列化和反序列化的实现
2021/05/19 Python
Jupyter Notebook内使用argparse报错的解决方案
2021/06/03 Python
Nginx实现会话保持的两种方式
2022/03/18 Servers
Python中的协程(Coroutine)操作模块(greenlet、gevent)
2022/05/30 Python