JS中的對象
對象
概念:簡單說,所謂對象,就是一種無序的數據集合,有若幹個“鍵值對”(key-value)構成。
var obj = { name : ‘tom‘, sex : ‘man‘ };
上面代碼中,大括號就定義了一個對象,這是一種字面量的寫法,它被復制給變量 obj 。 這個對象內部包含了一個鍵值對(又稱為“成員”), name 和 sex 是“鍵名”(成員的名稱),字符串“tom”和“man”是“鍵值”(成員的值)。鍵名和鍵值之間用冒號分割。如果對象內部包含多個鍵值對,每個鍵值對之間用逗號分割。
鍵名
對象的所有鍵名都是字符串,可以加引號也可以不加引號。如果鍵名是數值,會被自動轉換成字符串。
var o = { 1 : ‘a‘, 3.2 : ‘b‘ }
上面以數值作為鍵名都會轉換成字符串
如果鍵名不符合標識符的命名規則(比如第一個字符為數字,或者含有空格或運算符),也不是數字,則必須加上引號,否則會報錯。
var o ={ ‘1p‘ : "Hellow World", ‘h w‘ : "Hellow World", ‘p+q‘ : ‘Hellow World‘ };
上面的鍵值不符合標識符的命名規則,所以必須要加引號
對象的每一個“鍵名”又稱為“屬性”(property),它的“鍵值”可以是任何的數據類型。如果一個屬性的值為函數,通暢把這個屬性成為“方法”,它可以像函數那樣調用。
var obj = { p: function(){...} };
關於屬性的操作
對象的屬性有兩種方法可以讀取:
var obj = { name: ‘tom‘, sex:‘man‘ };
obj.name //"tom"
obj[‘sex‘] //"man"
可以通過對象名後面加點“.”的方式,也可以對象名後面加['']。
註意:如果鍵名是數值的話,不能用“.”的方式獲取對象的屬性,這樣會報錯,而用方括號的方式引號加不加上都可以。
對象的屬性可以動態的創建
var obj = { name: ‘tom‘, sex:‘man‘ }; obj.age= 20; obj.age //20
上面代碼對對象動態創建了一個屬性且賦值。
對象的操作
1)查看所有屬性
可以用 Object.keys 方法查看對象的所有屬性。
var obj = { name: ‘tom‘, sex:‘man‘ }; Object.keys(obj) //["name", "sex"]
2)刪除對象的屬性
用delete方法可以刪除對象的屬性,刪除成功後返回true。
var obj = { name: ‘tom‘, sex:‘man‘ }; delete obj.sex //true obj.sex //undefined Object.keys(obj) //["name"]
註意!刪除一個本來就沒有的屬性是不會報錯的,還是會返回true
3)in運算符
in運算符可以檢查對象是否包含某種屬性,如果包含返回true,反之返回false。
var obj = { name: ‘tom‘, sex:‘man‘ }; ‘name‘ in obj //true
4)for...in 循環
for...in 循環可以遍歷對象的所有屬性
var obj = { name: ‘tom‘, sex:‘man‘ }; for(var keys in obj){ console.log(obj[i]); } //"tom" //"man"
其他要點
對象的引用
如果不同的變量名指向同一個對象,那麽它們都是這個對象的引用,也就是說指向同一個內存地址。修改其中一個變量,會影響到其他所有變量。
var o1 = {}; var o2 = o1; o1.a = 1; console.log(o2.a); //1 o2.b = 2; console.log(o2.b); //2
上面代碼中,o1
和o2
指向同一個對象,因此為其中任何一個變量添加屬性,另一個變量都可以讀寫該屬性。
此時,如果取消某一個變量對於原對象的引用,不會影響到另一個變量。
var o1 = {}; var o2 = o1; o1 = 1; o2 // {}
上面代碼中,o1
和o2
指向同一個對象,然後o1
的值變為1,這時不會對o2
產生影響,o2
還是指向原來的那個對象。
但是,這種引用只局限於對象,如果兩個變量指向同一個原始類型的值。那麽,變量這時都是值的拷貝。
var x = 1; var y = x; x = 2; y // 1
上面的代碼中,當x
的值發生變化後,y
的值並不變,這就表示y
和x
並不是指向同一個內存地址。
參考資料:http://javascript.ruanyifeng.com/grammar/object.html#toc4
JS中的對象