天天看點

《JavaScript和jQuery實戰手冊(原書第2版)》——2.8節數組

2.8 數組

上一小節中使用的簡單變量隻是儲存了一段資訊,例如一個數字或一個字元串值。當你隻需要記錄分數、年齡或總價這樣的單個内容的時候,它們做得很好。然而,如果需要存儲一組相關的項目,例如,一個星期中的所有的星期幾名稱,或者web頁面上所有圖像的一個清單,此時簡單的變量并不是很友善使用。

例如,假設已經建立了一個javascript購物車系統,它記錄了通路者想要購買的商品,如果想要使用簡單的變量來記錄通路者添加到購物車中的所有商品,必須像下面這樣編寫代碼:

但是,如果想要添加更多的商品,該怎麼辦呢?必須建立更多的變量,item4、item5等。并且,由于不知道通路者想要購買多少商品,我們确實不知道應該建立多少變量。

好在javascript為記錄項目清單提供了一種更好的方法——數組。數組是在單個地方存儲多個值的一種方式。把數組當成是一個購物清單。當需要去雜貨店的時候,我們坐下來并寫下要購買的商品的清單。如果此前幾天剛剛去過雜貨店購物,這個清單可能隻包含一些商品,但是,如果儲存的食品已經很少了,這個購物清單可能相當長。不管清單中有多少商品,它還都隻是一個清單。

不使用數組的話,我們必須為清單中的每個商品建立一個變量。例如,想象一下,我們無法在單獨的一張紙上記錄下商品清單,而是必須使用一疊紙片,每張紙片用于記錄要購買的一項商品。如果想要添加其他需要購買的商品,就需要一張新的紙片,然後,在購物的時候按照每個紙片去進行(如圖2-5所示)。這就是簡單變量的工作方式。但是,通過使用數組,我們可以建立商品的一個單獨的清單,并且甚至可以随時添加、删除或修改商品。

《JavaScript和jQuery實戰手冊(原書第2版)》——2.8節數組

2.8.1 建立數組

要建立數組并在數組中存儲項目,首先聲明數組的名稱(就像我們對一個變量所做的一樣),然後提供逗号分隔的值的一個清單:每個值表示清單中的一個項目。和變量一樣,數組的名稱也取決于我們自己,但是需要遵守2.4.1節列出的命名規則。要表示一個數組,可以把項目清單放在開始方括号和結束方括号之間:

方括号[ ]非常重要,它們告訴javascript解釋器将要處理一個數組。我們可以建立一個空的沒有任何元素的數組:

建立一個空的數組,等同于2.4.1小節所介紹的聲明一個變量。當在程式運作時才向數組添加項目的情況下,我們将建立一個空的數組。例如,上面的數組可能用來記錄某人從web頁面上的一個清單中選擇的歌曲,此前我們不知道他将要選擇哪些歌曲,是以聲明了一個空的數組并且随後用他選擇的歌曲來填充項目(向數組添加項目将在2.8.3節介紹)。

注意: 在浏覽其他人的javascript程式(或其他的javascript圖書)的時候,我們可能會遇到另一種建立數組的方式,即使用array關鍵字,如下所示:

這種方法也是有效的,但是,本書中使用的方法(叫做數組直接量)需要更少的錄入和更短的代碼。

可以把值的任何混合形式存儲到一個數組中。換句話說,數值、字元串和boolean值都可以出現在同一個數組中:

注意: 我們甚至可以把數組和其他對象作為元素存儲到數組中。這有助于存儲複雜的資料。

上面這個數組的例子展示了在單獨一行代碼内建立數組。然而,如果我們已經有了很多要添加的項目,或者項目是較長的字元串,那麼,試圖在一行代碼中輸入所有内容會使得程式難以閱讀。在這種情況下,很多程式員選擇另一種方法,即通過數行代碼建立一個數組,如下所示:

正如2.4.2節中的“常見問題:javascript中的空格、制表符和回車”部分所介紹的,javascript解釋器會忽略額外的空格和分行符号,是以,即便這段代碼分5行顯示,它仍然是一條語句,最後一行的分号表明了這一點。

提示: 要讓名字像上面那樣排列,可以輸入第一行var authors = ['ernest hemingway',按下Enter鍵,然後多次按下空格鍵直到換到新行,輸入下一個值'charlotte bronte',。

2.8.2 通路數組中的項目

我們可以使用變量名來通路一個簡單變量的内容。例如,alert(lastname)打開一個警告框,該警告框帶有變量lastname中存儲的值。然而,因為數組可以存儲多個值,我們不能隻使用其名字來通路其中包含的項目。一個叫做索引的唯一編号表示了數組中每個項目的位置。要通路數組中的一個特定項目,我們使用項目的索引編号。例如,假設已經建立了一個數組,其中包含了星期幾的縮寫,并且我們想要打開一個警告框來顯示第一個項目。可以這樣編寫代碼:

這段代碼打開一個其中顯示‘mon’的警告框。數組是從0開始索引的,意味着數組中的第一項的索引值為0,第二項的索引值為1,換句話說,從項目在清單中的位置減去1就得到了其索引值,第5項的索引值是5—1,即4。當你剛開始程式設計時,從0開始索引确實容易令人混淆,是以,表2-4展示了(上面的例子中的)數組days是如何索引的、它包含的值以及如何通路每個值。

表2-4:數組中的項目必須使用一個索引編号來通路,這個索引編号等于它在清單中的位置減去1

《JavaScript和jQuery實戰手冊(原書第2版)》——2.8節數組

可以通過給索引位置賦一個新值來改變數組中一個項目的值。例如,要把一個新值放入數組days的第一個項目中,可以這樣編寫:

由于數組中的最後一項的索引編号總是比數組中的項目的總數小1,是以,要通路最後一項,隻需要知道數組中有多少項目就可以了。這是一項容易的任務,因為每個數組都有一個length屬性,它包含了數組中項目的總數。要通路length屬性,可以在數組名稱的後面添加一個點号,然後跟着length。例如,days.length傳回數組days中包含的項目數(如果建立了一個不同的數組,例如playlist,獲得其長度的方法是:playlist.length)。是以,可以使用簡短的javascript代碼來通路數組的最後一項所存儲的值:

上面的代碼段說明了我們不一定必須為索引提供一個直接量數值(例如,days[0]中的0)。我們也可以提供一個傳回有效數值的表達式:在這個例子中,days.length-1是一個簡短的表達式,它首先擷取days數組中項目的數目(在這個例子中是7),并且用它減去1。是以,在這個例子中,days[days.length-1]變成了days[6]。

還可以使用包含數值的一個變量來作為索引:

上面代碼的最後一行等價于alert(days[0]);。當在3.3節用到循環的時候,會發現這一技術特别有用。

2.8.3 向數組添加項目

假設我們建立了一個數組來記錄使用者在web頁面上單擊的項目。每次使用者單擊頁面,就向數組添加一個項目。javascript提供了向數組添加内容的幾種方式。

在數組的末尾添加一個項目

要在數組的末尾添加一個項目,可以使用2.8.2節介紹的索引表示法,使用比清單中的最後一項大1的一個索引值。例如,假設已經建立了一個名為properties的數組:

這段代碼運作之後,數組properties包含4個元素:['bold', 'red', '14px', 'arial']。和push()一樣,我們可以使用unshift()在數組的開始處插入多個項目:

注意: 確定使用的時候,在數組名的後面跟着一個點号和想要使用的方法。換句話說,push('new item')是無效的。必須先使用數組名(就是在建立數組時給數組的名字),然後跟着一個點号,然後是方法,例如: authors.push('stephen king');。

選擇如何向數組添加項目

到目前為止,本章介紹了向數組添加項目的3種方法。表2-5比較了這些技術。這些指令中的每一個都完成相似的任務,是以可以根據程式的情況來選擇其中一種。如果存儲在數組中的項目的順序無關緊要,那麼,這些方法中的任何一種都可以使用。例如,假設有一個産品圖檔的頁面,并且單擊一個圖檔就會把産品添加到購物車中。可以使用一個數組存儲購物車商品。商品出現在購物車(或數組)中的順序無關緊要,是以可以使用上述技術中的任何一種。

然而,如果建立一個數組來記錄某些事情發生的順序,那麼就與選擇的方法有關系了。例如,假設要建立一個頁面,它允許通路者通過單擊頁面上的歌名來建立一個歌曲播放清單。既然播放清單中的歌曲按照它們應該播放的順序來排列,那麼,順序是很重要的。是以,通路者每次單擊一首歌,這首歌曲的名字都應該出現在播放清單的末尾(是以,它将會是最後一首要播放的歌曲),那麼可以使用push()方法。

《JavaScript和jQuery實戰手冊(原書第2版)》——2.8節數組

push()和unshift()指令傳回一個值。具體來說,一旦push()和unshift()完成了任務,它們就可以提供數組中項目的數目。例如:

這段代碼運作之後,totalitems中存儲的值是6,因為現在p數組中有6個項目。

進階使用者提示

建立隊列

向數組添加項目的方法(push()和unshift())以及從數組删除項目的方法(pop() 和shift())通常一起使用,以提供按照項目建立的順序來通路它們的方法。典型的例子就是音樂播放清單。歌曲按照它們在清單中出現的順序播放,是以,先播放第一首歌并且随後從隊列中删除它。這一安排類似于排隊等候看電影。當你到達電影院,就在隊列的末尾排隊,當電影快要開始的時候,大門打開,隊列中的第一個人首先進去。在程式設計領域,這一概念叫做fifo(first in, first out,先進先出)。可以使用數組以及push()和shift()方法來模拟這種安排。例如,假設有一個名為playlist的數組。要在隊列的末尾添加一首新的歌曲,使用push()的方法如下:

這段代碼從數組中删除了第一個項目,并且将它存儲在名為nowplaying的變量中。fifo概念對于建立和管理諸如播放清單、任務清單或者圖像幻燈片這樣的隊列很有用。

2.8.4 從數組删除項目

如果想要從數組的末尾或開頭删除一個項目,可以使用pop()或shift()指令。這兩條指令都會從數組删除一個項目,pop()指令從數組末尾删除項目,而shift()從數組開始删除一個項目。表2-6比較了這兩種方法。

表2-6:從數組中删除項目的兩種方法

《JavaScript和jQuery實戰手冊(原書第2版)》——2.8節數組

與push()和unshift()一樣,一旦pop()和shift()完成了從數組删除項目的任務,會傳回一個值。實際上,它們傳回了剛剛删除的值。例如,下面的代碼删除一個值并将其存儲到removeditem變量中:

代碼運作後,removeditem的值是3并且數組p現在包含[0,1,2]。

注意: 本章的檔案包含了一個web頁面,可以用來互動地測試不同的數組指令。該檔案的名字是array_methods.html,位于教程的testbed目錄下。在web浏覽器中打開這個檔案,并且單擊web頁面上的各種按鈕,看看數組方法是如何工作的(另外,頁面的所有漂亮的互動功能都得益于javascript)。

繼續閱讀