1. 程式人生 > 其它 >狹義的物件(object)和陣列(array)

狹義的物件(object)和陣列(array)

一、狹義的物件(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