Yu Ken Code

[筆記] JavaScript 中 Array 的眉眉角角

2021/10/13js4113 minutes

[筆記] JavaScript 中 Array 的眉眉角角

目錄

  • 避免建立稀疏陣列
  • 字串當鍵值的注意事項
  • 類陣列(Array-Likes)
  • 字串

Array 在許多語言當中都是非常重要的裝載資料的容器,在 JavaScript 中,它能裝載各種型別的資料

const arr = [1, "Ken", true, { age: "20" }, ["ArrayInArray"]];

也可以是 Array 中又有 Array 裡面又有 Array ...非常巢狀的結構

整理一下一些我平常在操作陣列時會忽略的東西

避免建立稀疏陣列

亦即陣列當中有些值是 undefined

const arr = [];

arr[4] = "Ken";

console.log(arr); // [undefined, undefined, undefined, undefined, "Ken"]

字串當鍵值的注意事項

const arr = [];

arr[name] = "Ken";

console.log(arr); // []
console.log(arr.length); // 0
console.log(arr[name]); // "Ken"

以字串當鍵值後,不會改變其長度,並且整個陣列印出來也看不到,必須明確選取才能看到

const arr = [];

arr["3"] = "Ken";

console.log(arr); // [undefined, undefined, undefined, "Ken"]
console.log(arr.length); // 4
console.log(arr["3"]); // Ken

另外如果鍵值是數字,但型別是字串的話,它也會直接轉換為數字的型別

若要使用字串當鍵值的話,可以考慮用 Object 而不是用 Array

類陣列(Array-Likes)

類陣列是有 length 和 index 的物件,但它並沒有繼承 array 的方法

const arrayLikes = {
  0: "Ken",
  length: 1
};

arrayLikes[1] = "John";

console.log(arrayLikes[0]); // "Ken"
console.log(arrayLikes[1]); // "John"
console.log(arrayLikes.length); // 1

類陣列具有陣列 length, index 的特性,同時也能修改各個 index 值

const arrayLikes = {
  0: "Ken",
  length: 1
};

console.log(arrayLikes instanceof Array); // false

arrayLikes.forEach(item => {
  console.log(item);
}); // arrayLikes.forEach is not a function

他沒有繼承於 Array,所以像是 forEach, map, filter 等等方法都不能使用

可以透過 Array 方法中的 slice 將其轉換為真正的陣列

const arrayLikes = {
  0: "Ken",
  length: 1
};

const arr = Array.prototype.slice.call(arrayLikes);

console.log(arr); // ["Ken"]

什麼狀況會有類陣列出現?

像是在取 dom 元素的時候,getElementByClassName 就會回傳一個類陣列的結構

字串

其實我一開始都以為字串就是一種陣列,但事實上卻不是這樣的

const str = "Ken";
const arr = ["K", "e", "n"];

console.log(str.length, arr.length); // 3, 3
console.log(str.indexOf("K"), arr.indexOf("K")); // 0, 0
console.log(str[0], arr[0]); // "K", "K"

console.log(str.concat("Boy")); // "KenBoy"
console.log(arr.concat(["B", "o", "y"])); // ["K", "e", "n", "B", "o", "y"]

在許多方法字串的確跟陣列很像,甚至一模一樣

但在修改上卻是不太一樣的

const str = "Ken";
const arr = ["K", "e", "n"];

str[1] = "B";
arr[1] = "B";

console.log(str, arr); // "Ken", ["K", "B", "n"]

由於 String 本身是 immutable,若要更改需要建立一個新的字串並且回傳一個全新的值

相對 Array 是 mutable,所以可以直接更改

若要修改字串,可以透過一些字串的方法去修改並且回傳一個新的字串

const str = "Ken";
const newStr = str.toUpperCase();

console.log(newStr); // "KEN"
console.log(str === newStr); // false

另外字串與陣列之間的轉換,可以透過 split 和 join

const str = "Ken";
const arr = str.split("");
const newStr = arr.join("");

console.log(str); // "Ken"
console.log(arr); // ["K", "e", "n"]
console.log(newStr); // "Ken"

參考書籍:你所不知道的 JS 導讀,型別與文法 You Don't Know Js: Up & Going, Types & Grammar

tags:array-detail

date:2021/10/13