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 相关文章推荐
Windows Live的@live.com域名注册漏洞 利用代码
Dec 27 Javascript
当前流行的JavaScript代码风格指南
Sep 10 Javascript
jquery实现submit提交表单
Feb 03 Javascript
Bootstrap滚动监听(Scrollspy)插件详解
Apr 26 Javascript
JavaScript闭包和范围实例详解
Dec 19 Javascript
react系列从零开始_简单谈谈react
Jul 06 Javascript
深入剖析Express cookie-parser中间件实现示例
Feb 01 Javascript
最后说说Vue2 SSR 的 Cookies 问题
May 25 Javascript
js实现无限瀑布流实例方法
Sep 16 Javascript
vue多页面项目中路由使用history模式的方法
Sep 23 Javascript
vue 强制组件重新渲染(重置)的两种方案
Oct 29 Javascript
JS实现单张或多张图片持续无缝滚动的示例代码
May 10 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
php实现网站插件机制的方法
2009/11/10 PHP
PHP操作MongoDB时的整数问题及对策说明
2011/05/02 PHP
PHP写日志的实现方法
2014/11/05 PHP
推荐十款免费 WordPress 插件
2015/03/24 PHP
php实现向javascript传递数组的方法
2015/07/27 PHP
PHP实现文件上传与下载实例与总结
2016/03/13 PHP
PHP实现唤起微信支付功能
2019/02/18 PHP
JQuery UI DatePicker中z-index默认为1的解决办法
2010/09/28 Javascript
基于jquery 的一个progressbar widge
2010/10/29 Javascript
JS 退出系统并跳转到登录界面的实现代码
2013/06/29 Javascript
JS 有趣的eval优化输入验证实例代码
2013/09/22 Javascript
js 判断上传文件大小及格式代码
2013/11/13 Javascript
javascript教程之不完整的继承(js原型链)
2014/01/13 Javascript
JS、DOM和JQuery之间的关系示例分析
2014/04/09 Javascript
JavaScript判断变量是否为空的自定义函数分享
2015/01/31 Javascript
JavaScript Window浏览器对象模型方法与属性汇总
2015/04/20 Javascript
利用策略模式与装饰模式扩展JavaScript表单验证功能
2017/02/14 Javascript
jQuery中的on与bind绑定事件区别实例详解
2017/02/28 Javascript
vue 组件高级用法实例详解
2018/04/11 Javascript
vue移动端路由切换实例分析
2018/05/14 Javascript
layer.close()关闭进度条和Iframe窗的方法
2018/08/17 Javascript
PyQt5打开文件对话框QFileDialog实例代码
2018/02/07 Python
如何用C代码给Python写扩展库(Cython)
2019/05/17 Python
Django logging配置及使用详解
2019/07/23 Python
python传到前端的数据,双引号被转义的问题
2020/04/03 Python
Python如何批量生成和调用变量
2020/11/21 Python
python 邮件检测工具mmpi的使用
2021/01/04 Python
Linux如何命名文件--使用文件名时应注意
2014/05/29 面试题
中软国际Java程序员机试题
2012/08/19 面试题
二年级体育教学反思
2014/01/15 职场文书
上课睡觉检讨书300字
2014/11/18 职场文书
事业单位考察材料范文
2014/12/25 职场文书
2015年感恩父亲节演讲稿
2015/03/19 职场文书
幼儿园托班开学寄语(2015秋季)
2015/05/27 职场文书
matlab xlabel位置的设置方式
2021/05/21 Python
基于Redis的List实现特价商品列表功能
2021/08/30 Redis