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 相关文章推荐
判断用户是否在线的代码
Mar 05 Javascript
js实现获取焦点后光标在字符串后
Sep 17 Javascript
javascript与jquery中的this关键字用法实例分析
Dec 24 Javascript
过期软件破解办法实例详解
Jan 04 Javascript
移动端触屏幻灯片图片切换插件idangerous swiper.js
Apr 10 Javascript
vue2.0父子组件间通信的实现方法
Apr 19 Javascript
实例学习JavaScript读取和写入cookie
Jan 29 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
Jun 19 Javascript
从零开始在NPM上发布一个Vue组件的方法步骤
Dec 20 Javascript
解决vue组件props传值对象获取不到的问题
Jun 06 Javascript
使用vue实现一个电子签名组件的示例代码
Jan 06 Javascript
jQuery中event.target和this的区别详解
Aug 13 jQuery
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/09/30 PHP
PHP文件上传判断file是否己选择上传文件的方法
2014/11/10 PHP
Yii2框架数据库简单的增删改查语法小结
2016/08/31 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
2019/12/02 PHP
代码精简的可以实现元素圆角的js函数
2007/07/21 Javascript
能说明你的Javascript技术很烂的五个原因分析
2011/10/28 Javascript
JQuery验证jsp页面属性是否为空(实例代码)
2013/11/08 Javascript
jQuery中:header选择器用法实例
2014/12/29 Javascript
NodeJS学习笔记之Connect中间件应用实例
2015/01/27 NodeJs
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
JS实现的页面自定义滚动条效果
2015/10/26 Javascript
jQuery实现ajax调用WCF服务的方法(附带demo下载)
2015/12/04 Javascript
Vue.js表单控件实践
2016/10/27 Javascript
JQuery异步提交表单与文件上传功能示例
2017/01/12 Javascript
Vue2.0 实现单选互斥的方法
2018/04/13 Javascript
js模拟实现烟花特效
2020/03/10 Javascript
Vue+Bootstrap收藏(点赞)功能逻辑与具体实现
2020/10/22 Javascript
[14:50]2018DOTA2亚洲邀请赛开幕式
2018/04/03 DOTA
[01:11:28]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第一场 1月8日
2021/03/11 DOTA
python求列表交集的方法汇总
2014/11/10 Python
Python新手在作用域方面经常容易碰到的问题
2015/04/03 Python
Python文本相似性计算之编辑距离详解
2016/11/28 Python
使用Python获取网段IP个数以及地址清单的方法
2018/11/01 Python
python django model联合主键的例子
2019/08/06 Python
python输入错误后删除的方法
2019/10/12 Python
外贸业务员求职信范文
2013/12/12 职场文书
班子四风对照检查材料
2014/08/21 职场文书
2014年底工作总结
2014/12/15 职场文书
遗嘱范文
2015/08/07 职场文书
七年级作文之游记
2019/12/11 职场文书
浅谈tf.train.Saver()与tf.train.import_meta_graph的要点
2021/05/26 Python
详解Go语言运用广度优先搜索走迷宫
2021/06/23 Python
Redis高并发防止秒杀超卖实战源码解决方案
2021/11/01 Redis
JavaScript 中for/of,for/in 的详细介绍
2021/11/17 Javascript
鲲鹏 CentOS 7 安装Python3.7
2022/05/11 Servers
如何用H5实现好玩的2048小游戏
2022/07/23 HTML / CSS