javascript中稀疏数组和密集数组
密集数组
数组是一片连续的存储空间,有着固定的长度。加入数组其实位置是address,长度为n,那么占用的存储空间是address[0],address[1],address[2].......address[n-1]。即数组元素之间是紧密相连的,不存在空隙。如下的js代码创建的就是一个密集数组
1
|
var data = [3,1,6,9,2]; |
稀疏数组
与密集数组相反,javascript并不强制要求数组元素是紧密相连的,即允许间隙的存在。如下的js代码是合法的:
1
2
3
4
5
|
var sparse = new Array(); sparse[0] = 0; sparse[3] = 3; alert(sparse[0]); //输出0 alert(sparse[1]); //输出undefined |
1、创建稀疏数组
如下代码创建了一个固定长度的稀疏数组
1
2
3
4
|
var a = new Array(3); a[2] = 1; alert(a[0]); //undefined alert(a[2]); //1 |
js中建立稀疏数组很容易,只要你故意让数组元素之间存在间隙即可。如
1
2
3
|
var arr = []; arr[0] = 0; arr[200] = 200; |
2、创建密集数组
可以看到js中的数组一般都是稀疏的,一般来说稀疏数组的遍历比较麻烦。
1
|
var dense = Array.apply( null , Array(3)); |
这行代码等同于var dense = Array(undefined, undefined, undefined) ;这种方式跟稀疏数组没有什么差别。看代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//稀疏数组 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观察控制台输出结果是:
可以看到确实是有差别的:稀疏数组只遍历了一次(因为只有一个元素),密集数组遍历了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的数组元素是连续的。
如
1
|
var array = [1,2,3,4]; |
如:
1
|
var array = new Array();array[0]=0;array[1]=1; |
这样创建的js数组,就符合我们熟悉的数组了。
javascript中稀疏数组和密集数组的更多相关文章
- js中的稀疏数组和密集数组
原文地址: http://www.2ality.com/2012/06/dense-arrays.html 一般来说JavaScript中的数组都是稀疏的,也就是说数组中的元素与元素之间是由空格的,因 ...
- 读lodash源码之从slice看稀疏数组与密集数组
卑鄙是卑鄙者的通行证,高尚是高尚者的墓志铭. --北岛<回答> 看北岛就是从这两句诗开始的,高尚者已死,只剩卑鄙者在世间横行. 本文为读 lodash 源码的第一篇,后续文章会更新到这个仓 ...
- 理解JS里的稀疏数组与密集数组
一般来说,JavaScript中的数组是稀疏的. 什么是稀疏呢?稀疏也就是说,数组中的元素之间可以有空隙,因为一个数组其实就是一个键值映射.本文解释了如何创建稀疏数组和不稀疏的数组. 1.稀疏数组 创 ...
- 掌握javascript中的最基础数据结构-----数组
这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...
- javascript中对象字面量与数组字面量
第一部分 我们知道JavaScript中的数据类型有基本数据类型和引用类型,其中Object类型就是非常常用的类型.那么如果创建一个Object类型的实例呢?下面我介绍两种方法: 第一:构造函数法. ...
- javascript中的字符串对象和数组对象
1.javascript的对象的概念 在javascript中,除了null和undefined以处,其他的数据类型都被定义成了对象 也可以用创建对象的方法定义变量,string,math,array ...
- JavaScript中十种一步拷贝数组的方法
JavaScript中我们经常会遇到拷贝数组的场景,但是都有哪些方式能够来实现呢,我们不妨来梳理一下. 1.扩展运算符(浅拷贝) 自从ES6出现以来,这已经成为最流行的方法.它是一个很简单的语法,但是 ...
- JavaScript 中 for in 循环和数组的问题
本文由 伯乐在线 - ElvisKang 翻译,进林 校稿.未经许可,禁止转载!英文出处:adripofjavascript.com.欢迎加入翻译小组. JavaScript的for…in循环用于迭代 ...
- 每日分享!~ JavaScript中面试基础--1,数组检测的方式 2.传统事件绑定和W3C标准绑定事件的区别~
javaScript 那些方式中检测数据类型 typeof typeof isNaN // 结果是function 检测数组的几种方式 instanceof arr instanceof Array( ...
随机推荐
- 树节点递归删除--service层
@Service public class ContentCategoryServiceImpl extends BaseServiceImpl<ContentCategory> impl ...
- RGB转YUV 各种库的性能比较
分辨率 1920*1080 平台 : X64 Windows VS2015 测试 BGR24-->YUV420 trans_scale: 4.14 ms (自己写得)libyuv ...
- springboot启动流程(十一)aop切面处理过程
所有文章 https://www.cnblogs.com/lay2017/p/11478237.html 正文 spring的两大核心就是ioc和aop.在关于ioc依赖注入的文章中,我们了解了如何根 ...
- 手把手教你如何用java8新特性将List中按指定属性排序,过滤重复数据
在java中常常会遇到这样一个问题,在实际应用中,总会碰到对List排序并过滤重复的问题,如果List中放的只是简单的String类型过滤so easy,但是实际应用中并不会这么easy,往往List ...
- 3d转化
3d转化 想要实现3d效果,首先要确定的是观察点,这是2d转换所不需要的.具体的我也看的很糊涂,美术什么的根本不懂好吗. 但有些东西是确定的,perspective定义的是3d元素距视图的距离,因此像 ...
- ASE19团队项目 beta阶段 model组 scrum1 记录
本次会议于12月2日,18时30分在微软北京西二号楼sky garden召开,持续25分钟. 与会人员:Jiyan He, Kun Yan, Lei Chai, Linfeng Qi, Xueqing ...
- mariadb-server安装问题(Error: MariaDB-common conflicts with 1:mariadb-libs-5.5.60-1.el7_5.x86_64)
问题:今天在安装mariadb-server包时,提示错误,无法正确安装linux自带的mariadb包,提示错误很明确,是由于MariaDB-common包与mariadb-libs包冲突. 解决办 ...
- 安装mysql 好不容易成功了 却连不上
[mysqld] skip-grant-tables datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbo ...
- js中的分页
分页是前端经常会用到的一个非常实用的一个知识点,今天闲来没事,做了一个小demo,虽然样子,比较丑,哈哈哈,但是这是分页的核心思想都在,希望能给某个小伙伴一些启发.可直接复制在编辑器中运行. < ...
- sleep() 和 wait() 有什么区别?(未完成)
sleep() 和 wait() 有什么区别?(未完成)