接下來來到 JavaScript 另一個坑「物件」。
JavaScript 定義物件的方式主要有兩種形式:
var a = {}
:{}
稱為物件實字,是相對簡短且易讀的建立方式。var b = new Object();
:使用 Object
建構函式產生物件。這兩種建立方式就結果而言並無差別,但普遍來說會更推薦使用「物件實字」,主要原因如下:
在實戰上,也不太會使用 new Object()
來建立一個物件,這個方法則只會在學習原型、建構式時才會用到,如果還未接觸到此部分的開發者,可先把它放在一旁。而這兩種建立方式各有些微的事項需要注意。
物件實字的定義方式不太會出錯,只不過物件實字與陳述式中的 {}
的符號是相同的,所以在撰寫時需要注意所使用的是 陳述式 或 建構函式。
以下為 “物件實字”,可視為一個物件、表達式的結果。
{
name: '小明'
}
以下為 “區塊語法”,可視為一個陳述式(實戰中較少單獨使用,但可配合 let
、const
限制作用域),結構上與物件相當類似,請避免搞混。
{
const name = '小明'
}
延伸問題思考:區塊語法是否可以作為表達式運用?
new Object
預期會回傳一個新的物件,但如果傳入的結構並非為物件,依然可以正確運行,僅不過回傳的結果可能會不如預期,如以下範例會回傳一個「物件型別」的數字 1。
var num = new Object(1);
console.log(typeof num); // object
console.log(num + 1); // 2
console.log(num == 1); // true
console.log(num === 1); // false
物件的名稱定義可以看到許多不同的說法,在此透過 MDN 及原文來加以介紹,物件建立後會使用一個 {}
包覆著屬性(property
),每一個屬性包含著「名稱」(name)及「值」(value)。
{
name: value
// 名稱:值
}
一個屬性可以賦予純值、物件、陣列等等,依據開發的需求我們也同樣會賦予函式,而這類型的屬性則會稱為「方法」(methods)
var person = {
name: '小明', // 屬性
run: function() { // 函式則稱為方法
console.log('跑');
}
};
物件取值方式常見為點記號(Dot notation),這是精簡、好閱讀的取值方式,也算是最常運用的取值方法。以上述的程式碼來說,當取得 name
值時的點記號可以寫為:
console.log(person.name);
另一種方式是常被新手忽略的「括弧記法」(Bracket notation),寫法結構類似於一個陣列的取值方式,寫法如下:
console.log(person['name']); // 取值
person['run'](); // 呼叫函式
相對於點記號來說,[]
看似結構複雜難以閱讀,但它也能突破許多取值上的限制,以下皆為點記號無法運行的方式,如:
person[1] = '數字 1';
person['my-name'] = '小明';
console.log(person[1]);
console.log(person['my-name']);
var num = 1;
console.log(person[num]);
當可以使用變數存取物件值時,如欲屬性名稱不確定時,可以搭配 Object.keys
列出所有的屬性名稱,並且依序取出所有的物件值,方法如下:
var person = {
name: '小明', // 屬性
run: function() { // 函式則稱為方法
console.log('跑');
}
};
var keys = Object.keys(person); // keys 為 ['name', 'run']
keys.forEach(function(name) {
console.log(person[name]);
// 分別結果為 '小明' 及 'run' 的方法
});
物件與陣列同時都可以包含許多資訊,因此會難以分辨在定義時該使用陣列或是物件,以簡單的定義來說:
以汽車的資訊來說,一台車可能同時具有許多複雜的資訊,如品牌、色彩、價格、馬力、性能...,這些資訊並不重複且僅賦予在同一台車內,概念如下:
var car = {
brand: 'BMW',
color: 'white',
price: 1630000
};
單一品項,裡面需要不同的屬性進行描述就可使用物件
當定義了一台汽車以後,也可以使用同樣的概念定義更多的汽車,汽車成為複數時,則會是多台重複結構的汽車,這時就可以改用陣列來儲存這些資訊:
var cars = [{
brand: 'BMW',
color: 'black',
price: 2630000
},{
brand: 'Ferrari',
color: 'red',
price: 16300000
},{
brand: 'Toyota',
color: 'white',
price: 6300000
}];
多個品項,但品項內的結構大多是重複即可使用陣列