概要
在JavaScript中,数组以 Array
为构造函数,是一个高阶的类似有序列表的数据类型。
语法
[element0, element1, ..., elementN]
new Array(element0, element1[, ...[, elementN]])
new Array(arrayLength)
var arr = [];
属性
-
-
constructor
- 指定创建对象原型的函数。注意该属性值是一个指向函数自身的引用,而不是一个包含函数名称的字符串。
-
-
index
- 如果数组是通过正则表达式匹配创建的,匹配是字符串的下标索引为0.
-
-
prototype
-
Array.prototype
本身也是个数组。
-
方法
Mutator 方法
这些方法可以改变数组自身:
-
-
pop
- 移除数组的最后一个元素,返回值是被删除的元素。
-
-
push(
- 在数组的末尾添加一个或者多个元素,返回值是新的数组的长度。
element1, ..., elementN
) 返回数组长度
-
-
reverse
- 颠倒数组中元素的顺序,原先第一个元素现在变成最后一个,同样原先的最后一个元素变成了现在的第一个,也就是数组的索引发生了变化。
-
-
shift
- 删除数组的第一个元素,返回值是删除的元素。
-
-
sort(
- 对数组中的元素进行排序。
[compareFunction]
)
-
-
splice
-
添加或删除数组中的一个或多个元素。
- 从数组的哪一位开始修改内容。如果超出了数组的长度,则自动从数组末尾开始添加内容;如果是负值,则表示从数组末位开始的第几位。
-
整数,表示要移除的数组元素的个数。如果
howmany
是 0,则不移除元素。这种情况下,至少应添加一个新元素。如果howmany
超出了index
位之后的元素的总数,则从index
向后至数组末尾的全部元素都将被删除(含第index
位)。如果没有指定howmany
参数(如上第二种语法,是 SpiderMonkey 的扩展功能),将会删除第index
位之后的所有元素(不含第index
位)。 -
要添加进数组的元素。如果不指定,则
splice
只删除数组元素。
array.splice(index , howMany[, element1[, ...[, elementN]]])
array.splice(index) // SpiderMonkey/Firefox extension
参数
index
howMany
element1, ..., elementN
返回值
由被删除的元素组成的一个数组。如果只删除了一个元素,则返回只包含一个元素的数组。如果没有删除元素,则返回空数组。
-
-
-
unshift
- 添加一个或者多个元素在数组的开头,返回值是新的数组的长度。
Accessor 方法
这些过程不改变数组自身These methods do not modify the array and return some representation of the array.
-
-
concat(
-
返回一个包含此数组和其他数组和/或值的结合的新数组
- 需要与原数组合并的数组或非数组值
-
返回第一个与给定参数相等的数组元素的索引,没有找到则返回-1。
- 位于数组中的元素。
-
默认值: 0 (即在整个数组中查找指定元素)
- 将所有的数组元素连接成一个字符串。
value1, value2, ..., valueN
)参数
valueN
indexOfsearchElement
fromIndex
join([separator = ',']
) -
-
-
lastIndexOf(
-
方法返回指定元素(也即有效的 JavaScript 值或变量)在数组中的最后一个的索引,如果不存在则返回 -1。从数组的后面向前查找,从
fromIndex
处开始。 - 被查找的元素。
- 从此位置开始逆向查找。默认为数组的长度减 1,即整个数组都被查找。如果该值大于或等于数组的长度,则整个数组会被查找。如果为负值,将其视为从数组末尾向前的偏移。即使该值为负,数组仍然会被从后向前查找。如果该值为负时,其绝对值大于数组长度,则方法返回 -1,即数组不会被查找。
searchElement[, fromIndex = 0]
)
参数
searchElement
fromIndex
-
-
-
slice(
-
返回数组中的一段。方法把数组中一部分的浅复制(shallow copy)存入一个新的数组对象中,并返回这个新的数组
begin[, end]
)
-
-
-
toSource
-
Returns an array literal representing the specified array; you can use this value to create a new array. Overrides the Object.toSource method.searchElement[, fromIndex = arr.length - 1]
-
-
-
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的那些数组元素集合为新的数组返回。
- 用来测试数组每个元素的函数。
-
执行
callback
时的this
值。
callback[, thisArg]
)参数
callback
thisArg
-
-
-
forEach(
-
对数组的每一个元素依次调用参数中指定的函数。
- 在数组每一项上执行的函数,接收三个参数:
-
-
currentValue
- 当前项(指遍历时正在被处理那个数组项)的值。 index
- 当前项的索引(或下标)。 array
- 数组本身。
-
可选参数。
用来当作callback
函数内this的
值的对象。
callback[, thisArg]
)参数
callback
thisArg
-
-
-
every(
-
如果数组中每一个元素都满足参数中提供的测试函数,则返回真。
- 用来测试每个元素的函数。
-
执行
callback
时使用的this
值。
callback[, thisArg]
)callback
thisArg
-
-
-
map(
-
创建一个新数组,新数组中含有,分别对于原来数组的每一个元素调用一个给定函数的结果
- 原数组中的元素经过该方法后返回一个新的元素。
-
-
callback
的第一个参数,数组中当前被传递的元素。 -
callback
的第二个参数,数组中当前被传递的元素的索引。 -
callback
的第三个参数,调用map
方法的数组。
currentValue
index
array
-
-
执行
callback
函数时this
指向的对象。
callback[, thisArg]
)callback
thisArg
-
-
-
some(
-
如果数组中至少有一个元素满足参数函数的测试,则返回true。
- 用来测试每个元素的函数。
-
执行 callback 时使用的
this
值。
callback[, thisArg]
)参数
callback
thisArg
-
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];