本文轉(zhuǎn)載于javaeye(
http://www.javaeye.com/wiki/Object_Oriented_JavaScript/1279-javascript-object-oriented-technology-one),只進(jìn)行了重新排版以便收藏。
文中所有英文語句(程序語句除外),都引自<<javascript-the definitive guide,5th edition>>。
------------------------------------------------------------------------------------
數(shù)組
我們已經(jīng)提到過,對象是無序數(shù)據(jù)的集合,而數(shù)組則是有序數(shù)據(jù)的集合,數(shù)組中的數(shù)據(jù)(元素)通過索引(從0開始)來訪問,數(shù)組中的數(shù)據(jù)可以是任何的數(shù)據(jù)類型。數(shù)組本身仍舊是對象,但是由于數(shù)組的很多特性,通常情況下把數(shù)組和對象區(qū)別開來分別對待(Throughout this book, objects and arrays are often treated as distinct datatypes. This is a useful and reasonable simplification; you can treat objects and arrays as separate types for most of your JavaScript programming.To fully understand the behavior of objects and arrays, however, you have to know the truth: an array is nothing more than an object with a thin layer of extra functionality. You can see this with the typeof operator: applied to an array value, it returns the string "object". --section7.5).
創(chuàng)建數(shù)組可以用"[]"操作符,或者是用Array()構(gòu)造函數(shù)來new一個。
1
var array1 = []; //創(chuàng)建空數(shù)組
2
var array2 = new Array(); //創(chuàng)建空數(shù)組
3
array1 = [1,"s",[3,4],
{"name1":"NAME1"}]; //
4
alert(array1[2][1]); //4 訪問數(shù)組中的數(shù)組元素
5
alert(array1[3].name1); //NAME1 訪問數(shù)組中的對象
6
alert(array1[8]); //undefined
7
array2 = [,,]; //沒有數(shù)值填入只有逗號,則對應(yīng)索引處的元素為undefined
8
alert(array2.length); //3
9
alert(array2[1]); //undefined
用new Array()來創(chuàng)建數(shù)組時,可以指定一個默認(rèn)的大小,其中的值此時為undefined,以后可以再給他們賦值.但是由于javascript中的數(shù)組的長度是可以任意改變的,同時數(shù)組中的內(nèi)容也是可以任意改變的,因此這個初始化的長度實(shí)際上對數(shù)組沒有任何的約束力。對于一個數(shù)組,如果對超過它最大長度的索引賦值,則會改變數(shù)組的長度,同時會對沒有賦值
的索引處賦值undefined,看下面的例子:
1
var array = new Array(10);
2
alert(array.length); //10
3
alert(array[4]); //undefined
4
array[100] = "100th"; //這個操作會改變數(shù)組的長度,同時將10-99索引對應(yīng)的值設(shè)為undefined
5
alert(array.length); //101
6
alert(array[87]); //undefined
可以用delete操作符刪除數(shù)組的元素,注意這個刪除僅僅是將數(shù)組在該位置的元素設(shè)為undefined,數(shù)組的長度并沒有改變。我們已經(jīng)使用過了數(shù)組的length屬性,length屬性是一個可以讀/寫的屬性,也就是說我們可以通過改變數(shù)組的length屬性來任意的改變數(shù)組的長度。如果將length設(shè)為小于數(shù)組長度的值,則原數(shù)組中索引大于length-1的值都會被刪除。如果length的值大于原始數(shù)組的長度,則在它們之間的值設(shè)為undefined。
1
var array = new Array("n1","n2","n3","n4","n5"); //五個元素的數(shù)組
2
var astring = "";
3
for(var i=0; i<array.length; i++)
{ //循環(huán)數(shù)組元素
4
astring += array[i];
5
}
6
alert(astring); //n1n2n3n4n5
7
delete array[3]; //刪除數(shù)組元素的值
8
alert(array.length + "_" + array[3]) //5_undefined
9
10
array.length = 3; //縮減數(shù)組的長度
11
alert(array[3]); //undefined
12
array.length = 8; //擴(kuò)充數(shù)組的長度
13
alert(array[4]); //undefined
對于數(shù)組的其他方法諸如join/reverse等等,在這就不再一一舉例。
通過上面的解釋,我們已經(jīng)知道,對象的屬性值是通過屬性的名字(字符串類型)來獲取,而數(shù)組的元素是通過索引(整數(shù)型 0~~2**32-1)來得到值。數(shù)組本身也是一個對象,所以對象屬性的操作也完全適合于數(shù)組。
1
var array = new Array("no1","no2");
2
array["po"] = "props1";
3
alert(array.length); //2
4
//對于數(shù)組來說,array[0]同array["0"]效果是一樣的(?不確定,測試時如此)
5
alert(array[0] + "_" + array["1"] + "_" + array.po);//no1_no2_props1