對象
JS的簡單數據類型包括:數字、字符串、布爾值(true/false
)、null
值和undefined
,其他所有的值都是對象。數字、字符串、布爾值貌似對象,因爲他們擁有方法,但他們是不可變的。JS中的對象是可變的鍵控集合(keyed collection
)。在JS中,數組、函數和正則表達式都是對象,對象也是對象。
對象是屬性的容器,其中每個屬性都擁有名字和值。屬性的名字可以是包括空字符串在內的任意字符串,屬性值可以是除undefined以外的任意值。
JS裏的對象是無類型(class free
)的。它對新屬性的名字和值沒有限制,對象適用於彙集和管理數據,對象可以包含其他對象,所以它們很容易表示成樹狀或圖形結構。
JS包含一種原型鏈的特性,允許對象繼承另一個對象的屬性。正確地使用它能減少對象的初始化時消耗的時間和內存。(/lpc/-java類的繼承咯?)
對象字面量
對象字面量是一種可以方便地按指定的規格創建新對象的表述法。屬性名可以是標識符或字符串。這些名字被當作字面量名而不是變量名來對待,所以對象的屬性名在編譯時才能知道。屬性的值就是 表達式。
對象字面量提供了一種非常方便的創建新對象的表示法。一個對象字面量就是包圍在一對花括號中的零或多個”名/值“對。對象字面量可以出現在任何允許表達式出現的地方。
var empty_object = {};
var stooge = {
"first-name" : "Jerome",
"last-name":"Howard"
}
屬性名可以是包括空字符串在內的所有字符串。在對象字面量中,如果屬性名是一個合法的Javascript標識符且不是保留字,則並不強制要求你用引號括住。所以上面的代碼中”first-name
“必須用”“括起來,而first_name
就不用(因爲中間是下劃線)。逗號用來分割多個“名/值”對。
屬性的值可以從包括另一個對象字面量在內的任意字表達式獲得。對象可以是嵌套的:
var flight= {
airline : "Oceanic",
number : 815,
departure : {
TATA : "SYD",
time : "2004-09-22 14:55"
city :"Sydeny"
},
arrival : {
TATA : "LAX",
time : ”2004-09-22 14:55“,
city : "Los Angeles"
}
}
檢索
要檢索對象裏面包含的值,可以採用在[]
後綴括住一個字符串表達式的方式。如果字符串表達式是一個字符串字面量,而且是一個合法的Javascript標識符且不是保留字,那麼也可以用 .
表示法。
stooge ["first-name"] //"Jerome"
flight.departure.TATA //"SYD"
如果檢索一個不存在的成員屬性的值,將返回undefined
。||
運算符可以用來填充默認值:
var middle = stooge["middle-name"] || ["none"]; //若不存在middle-name屬性,將返回none
嘗試從undefined
的成員屬性中取值將會導致TypeError
異常。這時可以通過&&
運算符來避免錯誤。.
flight.equipment //unfefined
flight.equipment //throw"TypeError"
flight.equipment && flight.equipment.model; //undefined
更新
對象裏的值可以通過賦值語句來更新。如果屬性名已經存在於對象裏,那麼這個屬性的值就會被替換。
stooge['first-name'] = 'Jerome';
如果對像之前沒有該屬性名,那麼該屬性名就被擴充到對象中。(js真靈活!!)
stooge[''middle-name'] = 'Lester' ;
stooge.nickname = 'Curly';
引用
對象通過引用來傳遞。它們永遠不會被複制:
var x = stooge;
x.nickname = 'Curly';
var nick = stooge.nickname; //x和stooge指向同一對象,nick爲'Curly'。
var a = {},b={},c={}; //a,b和c每個都引用一個不同的空對象。
var a= b = c = {}; //都引用同一空對象。