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添加输出窗口的代码
Feb 07 Javascript
jquery实现标签支持图文排列带上下箭头按钮的选项卡
Mar 14 Javascript
JS实现点击按钮后框架内载入不同网页的方法
May 05 Javascript
JavaScript获取IP获取的是IPV6 如何校验
Jun 12 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
Nov 22 Javascript
详谈jQuery Ajax(load,post,get,ajax)的用法
Mar 02 Javascript
vue中如何创建多个ueditor实例教程
Nov 14 Javascript
boostrap模态框二次弹出清空原有内容的方法
Aug 10 Javascript
解决layer.open弹出框不能获取input框的值为空的问题
Sep 10 Javascript
VUEX-action可以修改state吗
Nov 19 Javascript
原生JS实现音乐播放器的示例代码
Feb 25 Javascript
js Proxy的原理详解
May 25 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
Zerg基本策略
2020/03/14 星际争霸
php url地址栏传中文乱码解决方法集合
2010/06/25 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
2014/09/16 PHP
PHP使用memcache缓存技术提高响应速度的方法
2014/12/26 PHP
php实现与python进行socket通信的方法示例
2017/08/30 PHP
PDO::errorCode讲解
2019/01/28 PHP
将字符串转换成gb2312或者utf-8编码的参数(js版)
2013/04/10 Javascript
JQUERY对单选框(radio)操作的小例子
2013/04/25 Javascript
jQuery实现图片信息的浮动显示实例代码
2013/08/28 Javascript
文本域中换行符的替换示例
2014/03/04 Javascript
Javascript 完美运动框架(逐行分析代码,让你轻松了运动的原理)
2015/01/23 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
2016/06/14 Javascript
JavaScript实现类似拉勾网的鼠标移入移出效果
2016/10/27 Javascript
深入理解JS继承和原型链的问题
2016/12/17 Javascript
实例分析JS与Node.js中的事件循环
2017/12/12 Javascript
vue里面父组件修改子组件样式的方法
2018/02/03 Javascript
使用node打造自己的命令行工具方法教程
2018/03/26 Javascript
详解JSON和JSONP劫持以及解决方法
2019/03/08 Javascript
fastadmin中调用js的方法
2019/05/14 Javascript
基于layui实现高级搜索(筛选)功能
2019/07/26 Javascript
如何利用JavaScript编写更好的条件语句详解
2020/08/10 Javascript
python 实时遍历日志文件
2016/04/12 Python
python merge、concat合并数据集的实例讲解
2018/04/12 Python
python调用外部程序的实操步骤
2019/03/04 Python
python psutil监控进程实例
2019/12/17 Python
Python xmltodict模块安装及代码实例
2020/10/05 Python
Python基于execjs运行js过程解析
2020/11/27 Python
利用CSS3的border-radius绘制太极及爱心图案示例
2016/05/17 HTML / CSS
小程序瀑布流解决左右两边高度差距过大的问题
2019/02/20 HTML / CSS
美国女性服饰销售网站:Nasty Gal(坏女孩)
2016/07/26 全球购物
工会主席岗位责任制
2014/02/11 职场文书
小班幼儿评语大全
2014/04/30 职场文书
整顿机关作风心得体会
2014/09/10 职场文书
花木兰观后感
2015/06/10 职场文书
《叶问2》观后感
2015/06/15 职场文书
解决Oracle数据库用户密码过期
2022/05/11 Oracle