javascript中的稀疏数组(sparse array)和密集数组

news/2024/7/8 1:33:17

学习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观察控制台输出结果是:


可以看到确实是有差别的:稀疏数组只遍历了一次(因为只有一个元素),密集数组遍历了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数组,就符合我们熟悉的数组了。



http://www.niftyadmin.cn/n/2097850.html

相关文章

C语言和C++中动态申请内存

在C语言和C的动态内存的使用方法是不同的&#xff0c;在C语言中要使用动态内存要包含一个头文件即 #include<malloc.h> 或者是#include<stdlib.h> 然后用C语言的系统函数 void * malloc(usigned size);来获得动态分配的内存&#xff0c;这个函数参数是需要申请的内…

Linux 文件系统基础——块、i节点

linux文件系统是Linux系统的心脏部分&#xff0c;提供了层次结构的目录和文件。文件系统将磁盘空间划分为每1024个字节一组&#xff0c;称为块(也有用512字节为一块的&#xff0c;如&#xff1a;SCOXENIX&#xff09;。编号从0到整个磁盘的最大块数。 全部块可划分为四个部分&a…

2018.6.15

2018.6.15 何浩认为&#xff1a;“春秋时期 (楚 )灭 国四十八 &#xff1a;[9] 权 、罗、卢戎 、郧、申、息 、缯、应、邓 、厉、贰、蓼 、州、 谷、绞、西黄、弦、黄 、英、氏、蒋、皖 、夔、道、柏 、房、 轸 、江 、六 、蓼 、都 、舒 、宗 、吕、庸、麋、舒蓼 、州来 、 萧…

ta是学计算机的,腾讯内容开放平台

很多人都说学计算机收入很高&#xff0c;所以都是抢着报考计算机的专业。只不过计算机相关专业挺多的&#xff0c;让人傻傻分不清楚怎么选择。其实报考计算机相关专业很重要&#xff0c;可能没选对专业&#xff0c;毕业后的待遇会是天差地别的。同样是学计算机&#xff0c;为何…

php7安装

http://www.hcoder.net/books/read/info/1135.html转载于:https://www.cnblogs.com/jinlin-2018/p/11257046.html

2018.6.16

2018.6.16 这里虽然没有直接记载楚武王设权县&#xff0c;但“尹之”可以看出是楚王指派县尹管理该地区。这也是《左传》中记载的第一个县。此时的县&#xff0c;应当是军政结合的行政单位&#xff0c;每县所驻扎之军队屡见诸史册&#xff0c;如《左传》僖公二十五年&#xff…

深入理解JavaScript运行机制

深入理解JavaScript运行机制 前言 本文是写作在给团队新人培训之际&#xff0c;所以其实本文的受众是对JavaScript的运行机制不了解或了解起来有困难的小伙伴。也就是说&#xff0c;其实真正的原理和本文阐述的并不完全符合&#xff0c;就如中学课本和大学课本一样&#xff0c;…

一个关于×××和NAT的问题

接口1和接口2均配电信分给专卖店使用的公网IP地址&#xff0c;接口2为专卖店内防火墙的公网接口&#xff0c;防火墙里面接两台终端&#xff0c;即多媒体接入单元和监控设备&#xff08;划图工具里没有那两样&#xff0c;现用两台PC代替&#xff09;&#xff0c;方框内为某单位拉…