狹義的物件(object)和陣列(array)
阿新 • • 發佈:2021-07-07
一、狹義的物件(object)
1、概述
- 鍵名和鍵值
- 物件的所有鍵名都是字串(ES6 又引入了 Symbol 值也可以作為鍵名)。
- 物件的每一個鍵名又稱為“屬性”(property),它的“鍵值”可以是任何資料型別。如果一個屬性的值為函式,通常把這個屬性稱為“方法”,它可以像函式那樣呼叫。
- 如果屬性的值還是一個物件,就形成了鏈式引用。
- 屬性可以動態建立,不必在物件宣告時就指定。
- 物件的引用
- 如果不同的變數名指向同一個物件,那麼它們都是這個物件的引用,也就是說指向同一個記憶體地址。修改其中一個變數,會影響到其他所有變數。
var o1 = {}; var o2 = o1; o1.a= 1; o2.a // 1 o2.b = 2; o1.b // 2
-
- 此時,如果取消某一個變數對於原物件的引用,不會影響到另一個變數。
var o1 = {}; var o2 = o1; o1 = 1; o2 // {}
- 判斷是語句還是表示式
- 總結就是:放在小括號中的是表示式,否則是語句(程式碼塊)。
{ foo: 123 } // 程式碼塊 { console.log(123) } // 123 程式碼塊 ({ foo: 123 }) // 正確 表示式 ({ console.log(123) }) // 報錯 表示式
2、屬性操作
- 屬性讀取
// 請注意,如果使用方括號運算子,鍵名必須放在引號裡面,否則會被當作變數處理。var foo = 'bar'; var obj = { foo: 1, bar: 2 }; obj.foo // 1 obj[foo] // 2
- 屬性檢視
// 檢視一個物件本身的所有屬性,可以使用Object.keys方法。 var obj = { key1: 1, key2: 2 }; Object.keys(obj); // ['key1', 'key2']
- 屬性刪除:delete命令
// delete命令用於刪除物件的屬性,刪除成功後返回true。 var obj = { p: 1 }; Object.keys(obj) // ["p"] delete obj.p //true obj.p // undefined Object.keys(obj) // []
- 屬性是否存在:in運算子
- in運算子用於檢查物件是否包含某個屬性(注意,檢查的是鍵名,不是鍵值),如果包含就返回true,否則返回false。它的左邊是一個字串,表示屬性名,右邊是一個物件。
- in運算子的一個問題是,它不能識別哪些屬性是物件自身的,哪些屬性是繼承的。就像上面程式碼中,物件obj本身並沒有toString屬性,但是in運算子會返回true,因為這個屬性是繼承的。
- 這時,可以使用物件的hasOwnProperty方法判斷一下,是否為物件自身的屬性。
var obj = { p: 1 }; 'p' in obj // true 'toString' in obj // true var obj = {}; if ('toString' in obj) { console.log(obj.hasOwnProperty('toString')) // false }
- 屬性遍歷:for...in迴圈
- for...in迴圈用來遍歷一個物件的全部屬性。
- 它遍歷的是物件所有可遍歷(enumerable)的屬性,會跳過不可遍歷的屬性。它不僅遍歷物件自身的屬性,還遍歷繼承的屬性。
- 一般情況下,都是隻想遍歷物件自身的屬性,所以使用for...in的時候,應該結合使用hasOwnProperty方法,在迴圈內部判斷一下,某個屬性是否為物件自身的屬性。
var obj = {a: 1, b: 2, c: 3}; for (var i in obj) { console.log('鍵名:', i); console.log('鍵值:', obj[i]); } // 鍵名: a // 鍵值: 1 // 鍵名: b // 鍵值: 2 // 鍵名: c // 鍵值: 3 var person = { name: '老張' }; for (var key in person) { if (person.hasOwnProperty(key)) { console.log(key); } } // name