iT邦幫忙

2021 iThome 鐵人賽

DAY 5
0
自我挑戰組

追憶JS年華系列 第 5

Day-05 JavaScript陣列

陣列可以一次宣告大量的變數,有節省時間、空間的優點。在JavaScript裡,陣列可儲存不同型態的值(包括物件、函式、原始資料類型、其他陣列等),相當方便。

然而,因為JavaScript每個元素的位元長度都不同,執行效能也較低。相較之下,一些只能儲存同型態值的語言(如C語言),雖較不便,但其各元素位元長度都一樣,效能相對較高。

建立與存取

值得注意的是,陣列有其順序性,存取必須透過 [ ] 加上索引值。而索引是從0開始計算的,換言之,以下面為例,想取得第一個城市的內容,就要用 city[0] 來取得。

陣列的建立與物件相同,同樣有兩種作法可用。

傳統作法(以new建立):

let city = new Array();

city[0] = “Taipei”
city[1] = “Taichung”
city[2] = “Kaohsiung”

實務作法1:陣列實字(array literal)

let city = [];

city[0] = “Taipei”
city[1] = “Taichung”
city[2] = “Kaohsiung”

實務作法2

let city = [“Taipei”, “Taichung”, “Kaohsiung”];

在前例中,若我們用length屬性取得陣列內容長度,會發現都是3(因為都塞入了3個內容)。

city.length; //印出3

視實際用途,陣列的長度可以透過指定,隨時增減。以前例為例,我們可以跳號指定第9個城市。
被跳過的陣列索引,因為沒指定值給它(們),自然就是 undefined了。

//前段略
city[8] = “Keelung”;

//接著印出陣列全部內容
console.log(city); //會印出 [“Taipei”, “Taichung”, “Kaohsiung”, undefined, undefined, undefined, undefined, undefined, “Keelung”]

內容增減

在前前例中,若想在「陣列末端」追加一個城市,可以運用push()方法:

let city = [“Taipei”, “Taichung”, “Kaohsiung”];

city.push(“Tainan”);
console.log(city); //會印出[“Taipei”, “Taichung”, “Kaohsiung”, “Tainan”]

同在此例,若想直接以「新北市」代換「台北市」的名稱(原地變更陣列中的值),可以用以 = 指定之:

let city = [“Taipei”, “Taichung”, “Kaohsiung”];

city[0] = “New Taipei”
console.log(city); //會印出[“New Taipei”, “Taichung”, “Kaohsiung”]

此外,尚有可在陣列中間插入元素的splice() 方法、刪除頭/尾的pop() 方法與shift() 方法等。
詳情可參閱MDN手冊如下:
https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/splice
https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/pop
https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Global_Objects/Array/shift

型別判斷

在JavaScript,若要檢查一個值的型別,可以用typeof運算子。前文我們已曾運用一次。然而,若我們直接以typeof去檢查陣列,由於歷史遺留問題,回傳的會是物件(object),而非陣列。如:

typeof []; // 回傳“object”

為了判斷一個值/變數究竟是物件?還是陣列?現行的JavaScript已有解方。我們可運用isArray() 方法解決此問題。

city.isArray([]); // true 是陣列
city.isArray([“Taipei”]);  // true 是陣列
city.isArray();  // false 不是陣列
city.isArray(null);  // false 不是陣列

上一篇
Day-04 JavaScript資料型別(3)
下一篇
Day-06 始於足下:基本語法、陳述句與宣告
系列文
追憶JS年華30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言