2.1 数组
和其他强类型语言不同,在 JavaScript 中,数组可以容纳任何类型的值,可以是字符串、数字、对象(object ),甚至是其他数组(多维数组就是通过这种方式来实现的):
var a = [ 1, "2", [3] ]; a.length; // 3 a[0] === 1; // true a[2][0] === 3; // true
对数组声明后即可向其中加入值,不需要预先设定大小(参见 3.4.1 节):
var a = [ ]; a.length; // 0 a[0] = 1; a[1] = "2"; a[2] = [ 3 ]; a.length; // 3
使用 delete 运算符可以将单元从数组中删除,但是请注意,单元删除后,数组的 length 属性并不会发生变化。第 5 章将详细介绍 delete 运算符。
在创建“稀疏”数组(sparse array,即含有空白或空缺单元的数组)时要特别注意:
var a = [ ]; a[0] = 1; // 此处没有设置a[1]单元 a[2] = [ 3 ]; a[1]; // undefined a.length; // 3
上面的代码可以正常运行,但其中的“空白单元”(empty slot)可能会导致出人意料的结果。a[1] 的值为 undefined ,但这与将其显式赋值为 undefined (a[1] = undefined )还是有所区别。详情请参见 3.4.1 节。
数组通过数字进行索引,但有趣的是它们也是对象,所以也可以包含字符串键值和属性(但这些并不计算在数组长度内):
var a = [ ]; a[0] = 1; a["foobar"] = 2; a.length; // 1 a["foobar"]; // 2 a.foobar; // 2
这里有个问题需要特别注意,如果字符串键值能够被强制类型转换为十进制数字的话,它就会被当作数字索引来处理。
var a = [ ]; a["13"] = 42; a.length; // 14
在数组中加入字符串键值 / 属性并不是一个好主意。建议使用对象来存放键值 / 属性值,用数组来存放数字索引值。
类数组
有时需要将类数组(一组通过数字索引的值)转换为真正的数组,这一般通过数组工具函数(如 indexOf(..) 、concat(..) 、forEach(..) 等)来实现。
例如,一些 DOM 查询操作会返回 DOM 元素列表,它们并非真正意义上的数组,但十分类似。另一个例子是通过 arguments 对象(类数组)将函数的参数当作列表来访问(从 ES6 开始已废止)。
工具函数 slice(..) 经常被用于这类转换:
function foo() { var arr = Array.prototype.slice.call( arguments ); arr.push( "bam" ); console.log( arr ); } foo( "bar", "baz" ); // ["bar","baz","bam"]
如上所示,slice() 返回参数列表(上例中是一个类数组)的一个数组复本。
用 ES6 中的内置工具函数 Array.from(..) 也能实现同样的功能:
... var arr = Array.from( arguments ); ...
Array.from(..) 有一些非常强大的功能,将在本系列的《你不知道的 JavaScript(下卷)》的“ES6 & Beyond”部分详细介绍。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论