JavaScript中的数组特性介绍


Posted in Javascript onDecember 30, 2014

与Java语言不同,JavaScript中的数组拥有三个特性:

 

1.无类型。数组的成员可以是任何类型,同一个数组也可以由很多不同类型的成员所组成。
2.长度可变。数组的长度是可以动态变化的,因此在JavaScript中不存在数组访问的越界问题。
3.不连续性。数组中成员的位置可以是连续的(0, 1, 2, 3…),也可以是不连续的。任何数组都有一个名为length的属性,在数组成员连续的情况下,length值与数组成员数目一致;当数组成员不连续时,length值要大于数组成员的数目。与连续的数组相比,不连续数组的读写性能要差一些。

 

实验:

var o = [42, "Sample Text", {x:88}];//JavaScript array is un-typed.

console.log(o);//[42, "Sample Text", Object {x=88}]

o[3] = 27;//JavaScript array is dynamic.

console.log(o);//[42, "Sample Text", Object {x=88}, 27]

o[5] = 99;//JavaScript array is sparse.

console.log(o);//[42, "Sample Text", Object {x=88}, 27, undefined, 99]

从上面的例子中可以看到,对于不连续的数组,当访问到缺失的那个成员时,JavaScript将返回undefined。如果数组连续,但是其中某个成员为undefined,那么访问数组的结果是一样的:

var a = [42, "Sample Text", {x:88}, 27, undefined, 99];

console.log(a);//[42, "Sample Text", Object {x=88}, 27, undefined, 99]

数组不连续、有成员缺失,跟数组连续、但有成员为undefined,这两种情况下访问数组内容所得到的结果是一样的。但在这两者之间还是存在一些细微的差别,主要表现在对数组key的访问上:

console.log(4 in o);//false

console.log(4 in a);//true

可以看到,这两种情况下虽然访问内容所得到的结果一致,但是其内部机制是完全不同的:在数组不连续的情况下,某个成员缺失,因此当访问该成员时,JavaScript返回了undefined;在数组连续的情况下,所有的成员都存在,只是某些成员的值比较特殊,为undefined而已。

从上面的例子中也可以看到,JavaScript中的数组究其本质只是以数字为key的对象而已,与普通的键值对对象没有任何差别。事实上,在对数组进行读取和写入操作时,JavaScript会试图将参数转换为正整数,如果转换成功则将进行数组操作(自动更新数组的length属性),如果失败则将参数转换成字符串后进行普通对象的读写操作。当然,在JavaScrpt解释器的实现中,针对数组的这种以数字作为key的特性作了很多性能优化,因此在实际使用过程中,如果对象的key都是数字,那么直接使用数组对象会得到更加高效的结果。

在对数组进行定义的过程中,JavaScript允许出现多余的逗号,也允许两个逗号间出现数组成员的缺失:

var x = [1,2,3,];//trailing comma will be omitted.

console.log(x.length);//3

         

var y = [1,,3];//member can be missed.

console.log(y);//[1, undefined, 3]

console.log(1 in y);//false

console.log(y.length);//3

对于数组的创建,JavaScript支持四种方法:

1.使用字面量(如上述几个例子中的中括号表达式)来直接创建数组对象。
2.使用Array()构造函数,不传入任何参数。在这种情况下,将创建一个空数组,其效果与[]等同。
3.使用Array()构造函数,传入一个正整数作为数组的长度。在这种情况下,JavaScript将预留相应的内存空间来存储这个数组。值得注意的是,此时数组的key都是没有被定义的,也即数组中没有任何成员。其效果与[,,,,]这样的写法等同
4.使用Array()构造函数,传入数组的成员。

实验:

var z = new Array(10);//pre-allocate memory, but no index is defined yet.

console.log(3 in z);//false
var m = new Array(42, 33, 99, "test", {k:99});

console.log(m);//[42, 33, 99, "test", Object {k=99}]

在ECMAScript 5标准中,可以用Array.isArray()来判断某个对象是否是数组:
Array.isArray([]);//true

Array.isArray({});//false
Javascript 相关文章推荐
怎么用javascript进行拖拽
Jul 20 Javascript
等待指定时间后自动跳转或关闭当前页面的js代码
Jul 09 Javascript
javascript中动态加载js文件多种解决办法总结
Nov 15 Javascript
jquery 删除字符串最后一个字符的方法解析
Feb 11 Javascript
使用Raygun来自动追踪AngularJS中的异常
Jun 23 Javascript
浅谈$(document)和$(window)的区别
Jul 15 Javascript
使用jQuery操作HTML的table表格的实例解析
Mar 13 Javascript
Bootstrap3 datetimepicker控件使用实例
Dec 13 Javascript
浅谈在vue项目中如何定义全局变量和全局函数
Oct 24 Javascript
全新打包工具parcel零配置vue开发脚手架
Jan 11 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
Apr 28 jQuery
Flutter部件内部状态管理小结之实现Vue的v-model功能
Jun 11 Javascript
JavaScript中数组成员的添加、删除介绍
Dec 30 #Javascript
JavaScript 实现打印,打印预览,打印设置
Dec 30 #Javascript
JavaScript中的数组操作介绍
Dec 30 #Javascript
jQuery中:first选择器用法实例
Dec 30 #Javascript
JavaScript中的类数组对象介绍
Dec 30 #Javascript
JavaScript中的方法调用详细介绍
Dec 30 #Javascript
JavaScript中的闭包(Closure)详细介绍
Dec 30 #Javascript
You might like
一首老MP3,致敬WAR3经典
2021/03/08 魔兽争霸
PHP 获取远程文件内容的函数代码
2010/03/24 PHP
PHP rawurlencode与urlencode函数的深入分析
2013/06/08 PHP
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
PHP计算日期相差天数实例分析
2016/02/23 PHP
php读取torrent种子文件内容的方法(测试可用)
2016/05/03 PHP
如何判断php mysqli扩展类是否开启
2016/12/24 PHP
php获取网站根目录物理路径的几种方法(推荐)
2017/03/04 PHP
thinkphp实现附件上传功能
2017/05/26 PHP
PHP生成各种随机验证码的方法总结【附demo源码】
2017/06/05 PHP
JQuery下关于$.Ready()的分析
2009/12/13 Javascript
Javascript学习笔记2 函数
2010/01/11 Javascript
ie8模式下click无反应点击option无反应的解决方法
2014/10/11 Javascript
原生JS实现仿淘宝网左侧商品分类菜单效果代码
2015/09/10 Javascript
快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突
2016/04/15 Javascript
值得学习的bootstrap fileinput文件上传工具
2016/11/08 Javascript
angular和BootStrap3实现购物车功能
2017/01/25 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
2019/04/17 Javascript
百度小程序之间的页面通信过程详解
2019/07/18 Javascript
在Node.js中将SVG图像转换为PNG,JPEG,TIFF,WEBP和HEIF格式的方法
2019/08/22 Javascript
JavaScript如何借用构造函数继承
2019/11/06 Javascript
react中hook介绍以及使用教程
2020/12/11 Javascript
Python 初始化多维数组代码
2008/09/06 Python
在Python中封装GObject模块进行图形化程序编程的教程
2015/04/14 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
2016/06/21 Python
Python使用email模块对邮件进行编码和解码的实例教程
2016/07/01 Python
Python闭包函数定义与用法分析
2018/07/20 Python
Python中常用的os操作汇总
2020/11/05 Python
python日志通过不同的等级打印不同的颜色(示例代码)
2021/01/13 Python
顶级宝石首饰网络零售商:Angara
2016/10/25 全球购物
英国领先的男装设计师服装购物网站:Mainline Menswear
2018/02/04 全球购物
.NET方向面试题
2014/11/20 面试题
什么是View State?
2013/01/27 面试题
个人考核材料
2014/05/15 职场文书
商场租赁意向书
2014/07/30 职场文书