返回介绍

第一部分 类型和语法

第二部分 异步和性能

2.1 数组

发布于 2023-05-24 16:38:21 字数 2008 浏览 0 评论 0 收藏 0

和其他强类型语言不同,在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文