概要
在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
) 返回數組長度 - 在數組的末尾添加一個或者多個元素,返回值是新的數組的長度。
- push(
-
- reverse
- 顛倒數組中元素的順序,原先第一個元素現在變成最後一個,同樣原先的最後一個元素變成了現在的第一個,也就是數組的索引發生了變化。
-
- shift
- 刪除數組的第一個元素,返回值是刪除的元素。
-
- sort(
[compareFunction]
) - 對數組中的元素進行排序。
- sort(
-
- splice
-
添加或刪除數組中的一個或多個元素。
array.splice(index , howMany[, element1[, ...[, elementN]]])
array.splice(index) // SpiderMonkey/Firefox extension
參數
index
- 從數組的哪一位開始修改內容。如果超出了數組的長度,則自動從數組末尾開始添加內容;如果是負值,則表示從數組末位開始的第幾位。
howMany
- 整數,表示要移除的數組元素的個數。如果
howmany
是 0,則不移除元素。這種情況下,至少應添加一個新元素。如果howmany
超出了index
位之後的元素的總數,則從index
向後至數組末尾的全部元素都將被刪除(含第index
位)。如果沒有指定howmany
參數(如上第二種語法,是 SpiderMonkey 的擴展功能),將會刪除第index
位之後的所有元素(不含第index
位)。
element1, ..., elementN
- 要添加進數組的元素。如果不指定,則
splice
只刪除數組元素。
返回值
由被刪除的元素組成的一個數組。如果只刪除了一個元素,則返回只包含一個元素的數組。如果沒有刪除元素,則返回空數組。
-
- unshift
- 添加一個或者多個元素在數組的開頭,返回值是新的數組的長度。
Accessor 方法
這些過程不改變數組自身These methods do not modify the array and return some representation of the array.
-
- concat(
value1, value2, ..., valueN
) -
返回一個包含此數組和其他數組和/或值的結合的新數組
參數
valueN
- 需要與原數組合並的數組或非數組值
- concat(
- indexOf
-
返回第一個與給定參數相等的數組元素的索引,沒有找到則返回-1。
searchElement
- 位於數組中的元素。
fromIndex
-
默認值: 0 (即在整個數組中查找指定元素)
join(
[separator = ',']
)將所有的數組元素連接成一個字符串。-
- lastIndexOf(
searchElement[, fromIndex = 0]
) -
方法返回指定元素(也即有效的 JavaScript 值或變量)在數組中的最後一個的索引,如果不存在則返回 -1。從數組的後面向前查找,從
fromIndex
處開始。
參數
searchElement
- 被查找的元素。
fromIndex
- 從此位置開始逆向查找。默認爲數組的長度減 1,即整個數組都被查找。如果該值大於或等於數組的長度,則整個數組會被查找。如果爲負值,將其視爲從數組末尾向前的偏移。即使該值爲負,數組仍然會被從後向前查找。如果該值爲負時,其絕對值大於數組長度,則方法返回 -1,即數組不會被查找。
- lastIndexOf(
-
- slice(
begin[, end]
) -
返回數組中的一段。方法把數組中一部分的淺複製(shallow copy)存入一個新的數組對象中,並返回這個新的數組
- 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.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(
callback[, thisArg]
) -
對數組中的每一個元素調用參數中指定的過濾函數,並將對於過濾函數返回值爲true的那些數組元素集合爲新的數組返回。
參數
callback
- 用來測試數組每個元素的函數。
thisArg
- 執行
callback
時的this
值。
- filter(
-
- forEach(
callback[, thisArg]
) -
對數組的每一個元素依次調用參數中指定的函數。
參數
callback
- 在數組每一項上執行的函數,接收三個參數:
-
- currentValue
- 當前項(指遍歷時正在被處理那個數組項)的值。
- index
- 當前項的索引(或下標)。
- array
- 數組本身。
thisArg
- 可選參數。
用來當作callback
函數內this的
值的對象。
- forEach(
-
- every(
callback[, thisArg]
) -
如果數組中每一個元素都滿足參數中提供的測試函數,則返回真。
callback
- 用來測試每個元素的函數。
thisArg
- 執行
callback
時使用的this
值。
- every(
-
- map(
callback[, thisArg]
) -
創建一個新數組,新數組中含有,分別對於原來數組的每一個元素調用一個給定函數的結果
callback
- 原數組中的元素經過該方法後返回一個新的元素。
-
currentValue
callback
的第一個參數,數組中當前被傳遞的元素。index
callback
的第二個參數,數組中當前被傳遞的元素的索引。array
callback
的第三個參數,調用map
方法的數組。
thisArg
- 執行
callback
函數時this
指向的對象。
- map(
-
- some(
callback[, thisArg]
) -
如果數組中至少有一個元素滿足參數函數的測試,則返回true。
參數
callback
- 用來測試每個元素的函數。
thisArg
- 執行 callback 時使用的
this
值。
- some(
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];