这篇翻译不完整。请帮忙从英语翻译这篇文章

概要

在JavaScript中,数组以 Array 为构造函数,是一个高阶的类似有序列表的数据类型。

语法


[element0, element1, ..., elementN]
new Array(element0, element1[, ...[, elementN]])
new Array(arrayLength)

元素列 —— elementN
Array 构造函数传递以 ”,“ 分号分割的一组数据(即元素列)时,将返回一个以这些数据为数组元素的数组对象(当元素列仅有一个数据且为数值时除外,这是接下来要说的内容)。数据的个数为元素个数,即数组长度。
数组长度 —— arrayLength
Array 构造函数传递一个在 0 到 232-1 之间的整数,将返回一个以此为长度的数组对象。通过length属性可以访问这个值。如果传入的参数不是有效的数值,则抛出RangeError异常。如果传入的参数不是数值,则创建一个长度为1的数组,传入的参数即为数组的第一个元素。

字面量表示法:

还可以用一对[ ]创建数组(注意下面的[ ]和上面的[ ]的不同,上面每一对中括号的意思是:括号括住的内容是可选的。不要与下面混淆。),即数组字面量。

[element0, element1, ..., elementN]

描述

数组是类似列表的对象,在原型中提供了一些遍历以及改变其中对象的方法。JavaScript 数组的长度及其中元素的类型都是不固定的。因为数组的长度可以随时增长或缩减,所以JavaScript 数组不保证是密集的。通常情况下,这是一些方便的特性;如果这些特性不适用于你的特定使用场景,你可以考虑使用固定类型数组。

有些人认为 you shouldn't use an array as an associative array。在任何情况下, 你可以使用原生的 objects 代替,不过这样做会出现需要注意的地方。请看例子: Lightweight JavaScript dictionaries with arbitrary keys .

访问数组里的元素

JavaScript 数组的索引值(index)从0开始,即数组第一个元素的索引值为0。最后一个元素的索引值等于该数组的长度减1(Array.length -1)。

var arr = ['this is the first element', 'this is the second element'];
console.log(arr[0]);              // prints 'this is the first element'
console.log(arr[1]);              // prints 'this is the second element'
console.log(arr[arr.length - 1]); // prints 'this is the second element'
 
 
 
 

数组中的元素都是其对象的属性,像 toString 就是一个属性, 但是使用下面这样使用会抛出语法错误,因为属性名称是非法的:

console.log(arr.0); // a syntax error
 

这是由非法属性造成的,不是 Array 特有的。JavaScript 中数字开头的属性不能跟在点号后面;必须在方括号中使用。比如说,如果你有一个名为 ‘3d’ 的属性,它只能通过方括号的形式进行访问。 如:

var years = [1950, 1960, 1970, 1980, 1990, 2000, 2010];
console.log(years.0);   // a syntax error
console.log(years[0]);  // works properly
 
 
 
renderer.3d.setTexture(model, 'character.png');     // a syntax error
renderer['3d'].setTexture(model, 'character.png');  // works properly
 
 

Note that in the 3d example, '3d' had to be quoted. It's possible to quote the JavaScript array indexes as well (e.g., years['2'] instead of years[2]), although it's not necessary. The 2 in years[2] is coerced into a string by the JavaScript engine through an implicit toString conversion. It is for this reason that'2' and '02' would refer to two different slots on the years object and the following example could betrue:

console.log(years['2'] != years['02']);
 

Similarly, object properties which happen to be reserved words(!) can only be accessed as string literals in bracket notation:

var promise = {
  'var'  : 'text',
  'array': [1, 2, 3, 4]
};

console.log(promise['array']);
 
 
 
 
 
 

Relationship between length and numerical properties

A JavaScript array's length property and numerical properties are connected. Several of the built-in array methods (e.g., join, slice, indexOf, etc.) take into account the value of an array's length property when they're called. Other methods (e.g., push, splice, etc.) also result in updates to an array's length property.

var fruits = [];
fruits.push('banana', 'apple', 'peach');

console.log(fruits.length); // 3
 
 
 
 

When setting a property on a JavaScript array when the property is a valid array index and that index is outside the current bounds of the array, the engine will update the array's length property accordingly:

fruits[5] = 'mango';
console.log(fruits[5]); // 'mango'
console.log(Object.keys(fruits));  // ['0', '1', '2', '5']
console.log(fruits.length); // 6
 
 
 
 

Increasing the length.

fruits.length = 10;
console.log(Object.keys(fruits)); // ['0', '1', '2', '5']
console.log(fruits.length); // 10
 
 
 

Decreasing the length property does, however, delete elements.

fruits.length = 2;
console.log(Object.keys(fruits)); // ['0', '1']
console.log(fruits.length); // 2
 
 
 

This is explained further on the Array.length page.

使用正则匹配的结果来创建数组

正则表达式与字符串之间的匹配结果可以创建一个数组。这个数组包含了正则匹配的属性与匹配结果。RegExp.exec, String.match, 与 String.replace的返回值就是这样的数组。下面的例子可以帮助理解这些属性。

// Match one d followed by one or more b's followed by one d
// Remember matched b's and the following d
// 忽略大小写

myRe = /d(b+)(d)/i;
myArray = myRe.exec("cdbBdbsbz");

改正则匹配返回的属性/元素列表:

Property/Element 说明 例子
input 原始的输入字符串,只读属性。 cdbBdbsbz
index 匹配的子字符串的第一个字符在原始字符串中的位置(从0开始的索引,只读)。 1
[0] 最后一次匹配的元素,只读。 dbBd
[1], ...[n] 出现在正则匹配中的子匹配(如果有)。 [1]: bB
[2]: d

先前的版本中的行为

JavaScript 1.2

在JavaScript 1.2解析器中,如果将单一整型数字传递给数组的构造器,那么构造器仅仅会创建一个以该数字为第一个元素的、长度为1的数组。例如:

new Array(5) //创建了第一个元素是5的,仅包含一个元素的数组。

 

JavaScript 1.0

一个数组的索引需要根据它的序数确定;例如:

myArray[0].

属性

constructor
指定创建对象原型的函数。
index
如果数组是通过正则表达式匹配创建的,匹配是字符串的下标索引为0.
input
如果数组是通过正则表达式匹配创建的,返回原始的字符串。
length长度
返回数组中元素个数.
prototype
允许为所有对象附加属性.

方法

Mutator 方法

这些方法可以改变数组自身:

pop
移除数组的最后一个元素,返回值是被删除的元素。
push
在数组的末尾添加一个或者多个元素,返回值是新的数组的长度。
reverse
颠倒数组中元素的顺序,原先第一个元素现在变成最后一个,同样原先的最后一个元素变成了现在的第一个,也就是数组的索引发生了变化。
shift
删除数组的第一个元素,返回值是删除的元素。
sort
对数组中的元素进行排序。
splice
添加或删除数组中的一个或多个元素。
unshift
添加一个或者多个元素在数组的开头,返回值是新的数组的长度。

Accessor 方法

need a better name...

这些过程不改变数组自身These methods do not modify the array and return some representation of the array.

concat
返回一个包含此数组和其他数组和/或值的结合的新数组
indexOf
返回第一个与给定参数相等的数组元素的索引,没有找到则返回-1。
join
将所有的数组元素连接成一个字符串。
lastIndexOf
返回在数组中搜索到的与给定参数相等的元素的最后(最大)索引。
slice
返回数组中的一段。
toSource
Returns an array literal representing the specified array; you can use this value to create a new array. Overrides the Object.toSource method.
toString
返回代表该数组及其元素的字符,重写Object.toString 过程.
valueOf
Returns the primitive value of the array. Overrides the Object.valueOf method.

循环(迭代)过程

Several methods take as arguments functions to be called back while processing the array. When these methods are called, the length of the array is sampled, and any element added beyond this length from within the callback is not visited. Other changes to the array (setting the value of or deleting an element) may affect the results of the operation if the method visits the changed element afterwards. The specific behaviour of these methods in such cases is not always well-defined, and should not be relied upon.

filter
对数组中的每一个元素调用参数中指定的过滤函数,并将对于过滤函数返回值为true的那些数组元素集合为新的数组返回。
forEach
对数组的每一个元素依次调用参数中指定的函数。
every
如果数组中每一个元素都满足参数中提供的测试函数,则返回真。
map
创建一个新数组,新数组中含有,分别对于原来数组的每一个元素调用一个给定函数的结果
some
如果数组中至少有一个元素满足参数函数的测试,则返回true。

Generic 方法

在Javascript数组对象上得许多方法也被设计用于那些看起来像数组的对象上。就是说,他们能被使用在任何一个有一个length属性并且能够通过数值属性名来访问的对象上(就像使用数组array[5]的下标)。

TODO: 给出使用 Array.prototype.forEach.call 的例子,并且添加这个方法给一个类似 JavaArray 或 String 的对象上。

一些方法,比如 join,仅仅读取他们被调用的对象的长度和数值属性。 另外,像 reverse 一样,要求对象的数值属性和长度属性是可变的;因此,这些方法不能在像 String 这样的对象上被调用,String不允许它的长度属性和synthesized的数值属性被设置。

那些在任何类Array对象上起作用并且不必修改长度和数值属性的方法是:

那些修改被调用的对象的长度或者数字属性的方法是:

这个例子展示了如何在一个 string 对象上使用 map 获得一个展现字符值的以ASCII编码的字节数组 :

var a = Array.prototype.map.call("Hello World", 
                                 function(x) { return x.charCodeAt(0); })
// a now equals [72,101,108,108,111,32,87,111,114,108,100]

例子

例子:创建数组

这个例子,创建了一个空数组,长度为0,接着对msgArray[0]赋值,让后对msgArray[99]赋值,数组长度变成了100。

var msgArray = new Array();
msgArray[0] = "你好";
msgArray[99] = "宝贝";
// 因为数组元素msgArray[99]已经定义,
// 所以下面的条件成立。
if (msgArray.length == 100)
   myVar = "数组的长度是100。";

例子:二维数组

这个例子创建了一个二维数组myVar,然后赋值。

var myVar = "二维数组实例;\n";
a = new Array(4);
for (var i = 0; i < 4; i++) {
   a[i] = new Array(4);
   for (var j = 0; j < 4; j++) {
      a[i][j] = "[" + i + "," + j + "]";
   }
}
for (var i = 0; i < 4; i++) {
   str = "Row " + i + ":";
   for (var j = 0; j < 4; j++) {
      str += a[i][j];
   }
   myVar += str + ";\n";
}

下面是myVar的值:

二维数组实例;
Row 0: [0,0][0,1][0,2][0,3];
Row 1: [1,0][1,1][1,2][1,3];
Row 2: [2,0][2,1][2,2][2,3];
Row 3: [3,0][3,1][3,2][3,3];

文档标签和贡献者

最后编辑者: FredWe,
隐藏侧边栏