1. 程式人生 > >JS中的對象

JS中的對象

大括號 數據集 變化 nbsp 數值 object.h 包含 方式 一個

  對象

概念:簡單說,所謂對象,就是一種無序的數據集合,有若幹個“鍵值對”(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

上面代碼中,o1o2指向同一個對象,因此為其中任何一個變量添加屬性,另一個變量都可以讀寫該屬性。

此時,如果取消某一個變量對於原對象的引用,不會影響到另一個變量。

var o1 = {};
var o2 = o1;

o1 = 1;
o2 // {}

上面代碼中,o1o2指向同一個對象,然後o1的值變為1,這時不會對o2產生影響,o2還是指向原來的那個對象。

但是,這種引用只局限於對象,如果兩個變量指向同一個原始類型的值。那麽,變量這時都是值的拷貝。

var x = 1;
var y = x;

x = 2;
y // 1

上面的代碼中,當x的值發生變化後,y的值並不變,這就表示yx並不是指向同一個內存地址。

參考資料:http://javascript.ruanyifeng.com/grammar/object.html#toc4

JS中的對象