在javascript中,數組和對象時2種不同的資料類型,而且它們也是最重要的2種資料類型。
對象
1.建立對象
建立對象的最簡單方法就是在javascript代碼中加入一個對象直接量。對象直接量是用逗號分開的一對對的屬性名稱和值的列表,包含在意個花括弧之中,每個屬性名稱都可以使一個javascript的標識符或一個字串,每個屬性值可以是一個常量或任意的javascript運算式。
var empty = {}; var point = { x: 0, y: 0 }; var circle = { x: point, y: point.y + 1, radius: 2 }; var home = { "name": "Homer Simpson", "age": "34", "married": true, "occupation": "plant operator", 'email': "homer@example.com" };
new運算子可以建立具體的一類對象。在new的後面跟著調用一個建構函式,它用來初始化對象屬性。
var a = new Array(); var b = new Date(); var r = new RegExp("haha","hehe");
2.對象的屬性
通常用“.”運算子來儲存物件的屬性的值。位於"."運算子左邊的值是想要訪問其屬性的對象。通常,它只是包含了該對象的引用的變數名,但它可以是任何一個結果對象的javascript運算式。位於“.”右邊的值應該是屬性名稱,它必須是以個標識符,而不能使字串或運算式。
var book = {}; book.title = "java"; book.chapter1 = new Object(); book.chapter1.title = "c#"; book.chapter1.page = 11; book.chapter2 = { title: "c++", page: 6 }; //可以通過alert來測試
可以使用運算子delete來刪除已個對象的屬性
delete book.chapter2;
3.作為關聯陣列的對象
我們已經見過用運算子“.”來取一個對象屬性,而數組更常用的存取屬性運算子是[]。
book.chapter2; book["chapter2"]; //2個運算式的值相等
在C、C++等強型別語音中,一個對象的屬性石固定的,而且必須預定義這些屬性的名字。由於javascript是一種松類型的語言,它不採取這一規則,所以在用javascript編寫的程式中,可以為對象建立任意數目的屬性。但採用用運算子“.”來取一個對象的屬性時,屬性名稱是用標示符標示的。而在javascript程式中,標示符必須被逐個輸入,它們不是一種資料類型,因此程式不能對它們進行操作。但用數組的[]表示方法來存取一個對象的屬性時,屬性是用字串表示的。所以可以在程式裡面進行操作。
var a = { a1: 1, a2: 2, a3: 3, a4: 4 }; var b = 0; for (i = 1; i <= 4; i++) { b = b+a["a" + i]; } alert(b);//10
4.通用的object屬性和方法
沒一個對象都有constructor屬性,它引用了初始化這個對象的建構函式。
var d = new Date(); //可以用判定對象的類型 if ((typeof d == "object") && (d.constructor == Date)) { alert("is Date"); } else { alert("Not Date"); }
數組
數組array是一個有序的,值的集合。每一個值叫做一個元素(element),每個元素在數組中都有一個數字化的位置較下標(index)。由於javascript是一種非類型語言,所以一個數組的元素可以具有任意的資料類型,同一個數組的不同元素可以具有不同的類型。
var empty = []; //空數組 var a = [2, 3, 4, 5, 6]; var b = [1.1, true, "a"];//元素可以為不同的類型 var base = 1024; var table = [base, base + 1, base + 2, base = 3]; //數組元素可以使運算式 var c = [[1, { x: 1, y: 2}], [2, { x: 3, y: 4}]]; //數組直接量可以包含對象直接量或者其他的數組直接量
建立數組的另一種方式是使用Array建構函式。
var a = new Array(); var a = new Array(1, 2, 3, "1", "2"); var a = new Array(10);//指定數組的長度
數組元素的讀寫,數組的第一個下標為0;
//數組可以通過使用[]方括弧來儲存數組 var a = a[0]; a[1] = 3.14; i = 2; a[i] = 3; a[i + 1] = "hello"; a[a[i]] = a[0];
前面的已經提到,[]運算子可以用來訪問對象的已命名屬性
my['a'] = 2; //因為數組時一種特殊的對象,可以再數組上定義非數位對象屬性,並且使用,或者[]的文法來訪問它
數組的下標範圍是0 - 2的32次方 的整數,如果數組的下標為負數、浮點數、布爾值、對象及其他值,javascript會直接將它轉換為一個字串,用產生的字串作為對象的屬性名稱字。
添加數組的新元素
好像在C# 等語言中,數組時具有固定的元素的,必須在建立時指定數組長度。而在javascript中則不同,它的數組可以具有任意個數的元素,可以再任意時刻改變元素個數。
//添加元素,直接賦值 a[10] = 10;
在javascript中數組 是稀疏的。這意味著數組的下標不必落在一個連續的數字範圍內,只有那些真正儲存在數組中的元素才能夠有javascript實現分配到記憶體。
a[0] = 1; a[10000] = 10000; //解析器只給數組下標為0和10000的元素分配記憶體,而並不給0到10000之間的那9999個元素分配記憶體
3.刪除數組元素
delete運算子把一個數組的元素設定為undefined值,但是元素本身還繼續存在。要真正的刪除一個元素,以使下標位置高於它的所有元素都向下遷移到較低的下標位置,必須使用一個數組的方法.
var b = [1, 2, 3, 4, 5, 6, 7]; b.shift()//刪除第一個元素 b.pop(); //刪除最後一個元素 b.splice(2,3); //刪除一個區間的元素
數組的長度
所有數組無論是由建構函式array()建立的,或者是直接建立的。它們都有一個特殊的屬性length,和常見的對象屬性不同,數組的length屬性石自動更新的。
var a = new Array(); //a.length=0 a = new Array(10); //a.length=10 a = new Array(1, 2, 3); //a.length=3 a = [1, 2]; //a.length=2 a[5] = -1; //a.length=6 a[49] = 0; //a.length=50
多維陣列
雖然javascript並不支援真正的多維陣列,但是它允許數組的元素為數組的數組,這樣就非常接近多維陣列。要儲存一個數組的元素為數組裡面的元素,只要使用多次[]運算子即可
var a = [[1, 2], [3, 4], [5, 6]]; alert(a[0][1]);//2
數組的方法
//join把一個數組的所有元素都轉為字串 var a = [1, 2, 3, 4, 5, 6]; //alert(a.join()); //join把一個數組的所有元素都轉為字串 輸出為1,2,3,4,5,6 //alert(a.join('&')); //join把一個數組的所有元素都轉為字串,還可以指定分隔字元 輸出為1&2&3&4&5&6 var b = "1,2,3,4,5,6,7"; b.split(',');//split 和 join 相反 是把一個字串,拆分為數組 //alert(b[0]); //reverse把一個數組元素順序顛倒 a.reverse(); alert(a[0]); //concat能建立並返回一個數組,這個數組包含了調用concat的原始數組的元素 var c = [1, 2, 3]; //concat能常見 a.concat(4.5) //returns [1,2,3,4,5]