iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 6
0
Modern Web

前端常見問題攻略系列 第 6

JS 物件名詞解釋及常見觀念問題

  • 分享至 

  • xImage
  •  

接下來來到 JavaScript 另一個坑「物件」。

物件的定義方法差在哪?

JavaScript 定義物件的方式主要有兩種形式:

  • var a = {}{} 稱為物件實字,是相對簡短且易讀的建立方式。
  • var b = new Object();:使用 Object 建構函式產生物件。

這兩種建立方式就結果而言並無差別,但普遍來說會更推薦使用「物件實字」,主要原因如下:

  1. 相對於建構式來說更為簡短
  2. 物件實字易讀性佳
  3. 效能優於建構函式,可參考相關 討論 1討論 2
  4. 避免無關緊要的錯誤(下方補充)

在實戰上,也不太會使用 new Object() 來建立一個物件,這個方法則只會在學習原型、建構式時才會用到,如果還未接觸到此部分的開發者,可先把它放在一旁。而這兩種建立方式各有些微的事項需要注意。

物件實字

物件實字的定義方式不太會出錯,只不過物件實字與陳述式中的 {} 的符號是相同的,所以在撰寫時需要注意所使用的是 陳述式 或 建構函式。

以下為 “物件實字”,可視為一個物件、表達式的結果。

{
  name: '小明'
}

以下為 “區塊語法”,可視為一個陳述式(實戰中較少單獨使用,但可配合 letconst 限制作用域),結構上與物件相當類似,請避免搞混。

{
  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']();              // 呼叫函式

相對於點記號來說,[] 看似結構複雜難以閱讀,但它也能突破許多取值上的限制,以下皆為點記號無法運行的方式,如:

  1. 特殊字元的賦值、取值
person[1] = '數字 1';
person['my-name'] = '小明';

console.log(person[1]);
console.log(person['my-name']);
  1. 使用變數進行操作
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
};

https://ithelp.ithome.com.tw/upload/images/20200921/20083608eGdfQMTCEw.png

單一品項,裡面需要不同的屬性進行描述就可使用物件

當定義了一台汽車以後,也可以使用同樣的概念定義更多的汽車,汽車成為複數時,則會是多台重複結構的汽車,這時就可以改用陣列來儲存這些資訊:

var cars = [{
  brand: 'BMW',
  color: 'black',
  price: 2630000
},{
  brand: 'Ferrari',
  color: 'red',
  price: 16300000
},{
  brand: 'Toyota',
  color: 'white',
  price: 6300000
}];

https://ithelp.ithome.com.tw/upload/images/20200921/200836089DJ9iWrHtT.png

多個品項,但品項內的結構大多是重複即可使用陣列


上一篇
Day5 JS 加不加分號差在哪?
下一篇
呼叫函式時,到底有多少個參數 / 變數可供使用?
系列文
前端常見問題攻略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言