簡評:作者將 JavaScript 的陣列和物件比喻為書和報紙,陣列更注重順序,而標籤則對物件更重要。
如果你讀書、看報,那麼你會理解 JavaScript 的陣列和物件之間的不同之處。
當你剛開始學 JavaScript 時,用哪一種方式組織和儲存資料更好往往會讓人困惑。
一方面,你可能在學習 “for” 迴圈的時候熟悉了陣列。但是,一旦你儘可能多地將資料塞進陣列,當你在檢查你的程式碼的時候,你創造的亂七八糟的東西將會讓你難以理解。
當你可以快速地決定每個結構的目標時,在物件和陣列之間選擇會簡單得多。陣列和書籍儲存資訊的方式相差無幾,而物件則和報紙儲存資訊的方式差不多。
讓我們來看看!
陣列:資料的順序是最重要的
這是超短篇小說的章節,以陣列的形式。
1 |
var book = ['foreword', 'boyWhoLived', 'vanishingGlass', 'lettersFromNoOne', 'afterword']; |
好吧,我承認,這是《哈利波特》系列的第一本的前三章。這是陣列的視覺化的形式:
當順序成為組織資訊的最重要的因素時你應該使用陣列。沒有人(我希望)這樣看《哈利波特》的章節標題,“嗯…,那章看起來很有趣,讓我跳到那!”章節的順序告訴你下一章是什麼。
當你從陣列中檢索資訊時,你使用每個元素的下標。陣列是從零開始索引的,這意味著從 0 開始計數而不是 1。
如果你想要訪問下標為 0 的書籍陣列,你要用:
1 |
books[0] |
然後你會得到:
1 |
'foreword' |
如果你想得到這本書第三章的章節標題,你要用:
1 |
books[2] |
你會基於書的章節順序來讀下一章,而不是基於書的章節標題。
物件:資料標籤是最重要的
報紙可能看起來是這樣的,以物件的形式。
1 2 3 4 5 |
var newspaper= { sports: 'ARod Hits Home Run', business: 'GE Stock Dips Again', movies: 'Superman Is A Flop' } |
下面是以視覺化的形式來看同樣的資料。
當你要基於資料標籤來組織資料時,物件是最好的。當你看報紙時,你可能不會從前往後一頁頁地讀。你會基於新聞標題來跳過特定的部分。無論在報紙的哪個地方,你都可以快速的跳過並且有合適的上下文。這和書不一樣,書的章節順序很重要。
物件通過鍵/值對來組織資料。看起來像這樣:
1 |
key: value |
如果你想要進入報紙的商業部分,你會使用這樣的鍵:
1 |
newspaper[‘business’] |
或者:
1 |
newspaper.business |
這回返回值 ‘GE Stock Dips Again’。所以,通過資料的標籤(鍵)來訪問資料是最簡單的,你想要把資料存在物件裡。
結合物件和陣列
目前為止,我們只是在陣列和物件中儲存了 strings,你也可以儲存其他型別的資料,比如 numbers 和 booleans,同時:
- 物件內的陣列
- 陣列中的物件
- 陣列中的陣列
- 物件中的物件
現在開始變複雜了。但是,你幾乎只需要兩種以擴充套件方式的組合來儲存你的資料。當你一星期後回顧程式碼也想要理解。
讓我們再看下書的例子。如果我們想要儲存每章的頁數會怎樣呢?用物件來填滿我們的陣列可能是最好的。像這樣:
1 2 3 4 |
var book =[ [‘foreword’, 14], [‘boywholived’, 18] ] |
1 2 3 4 5 6 7 |
var book = [ {name:'foreword', pageCount: 14}, {name:'boyWhoLived', pageCount: 18}, {name:'vanishingGlass', pageCount: 13}, {name:'lettersFromNoOne', pageCount: 17}, {name:'afterword', pageCount: 19} ]; |
我們維護了每章的順序,現在我們可以叫出每章的特定的屬性。所以,如果我們想要知道第二張的頁數,我們可以用:
1 |
book[1][‘pageCount’] |
這會返回一個 18 的值。
現在假設你想知道你當地報紙每個欄目的頂級作者的排名,基於他們的資歷。你可以在報紙物件中用一個陣列來表達,像這樣:
1 2 3 4 5 6 7 8 |
var newspaper= { sports: 'ARod Hits Home Run', sportsWriters: ['Miramon Nuevo', 'Rick Reilly', 'Woddy Paige'], business: 'GE Stock Dips Again', businessWriters: ['Adam Smith', 'Albert Humphrey', 'Charles Handy'], movies: 'Superman Is A Flop', moviesWriters: ['Rogert Ebert', 'Andrew Sarris', 'Wesley Morris'] } |
一個陣列用來儲存作者很合適,因為順序很重要。你知道每個陣列中靠前的作者排名更高。下標為 0 的作者是排名最高的。
你可以通過建立物件來優化報紙物件。比如,一個包含標題和作者列表的體育物件。但我會讓你來嘗試!