切換語言為:簡體

總結 JavaScipt 中那些陣列與字串中容易混淆的方法

  • 爱糖宝
  • 2024-07-14
  • 2075
  • 0
  • 0

前言

大家好!不知道大家怎麼樣昂,反正每當我在做專案或者刷題時,總會遇到一些讓我頭疼的問題,就是關於陣列和字串的處理方法,它們看似相似,實則大有乾坤。今天,我決定整理一篇筆記,專門用來總結那些常讓人記錯的陣列和字串的操作,希望能幫到跟我一樣時常對此感到煩惱的友友們。

一、定義與初始化

先看看自己能不能回答的出來下面的問題,雖然乍一看很簡單,但是要好好回答卻總會腦子短路。

提問:

  • 我們可以直接透過單引號或雙引號初始化什麼?

  • 陣列的元素是如何分隔的?字串裡的空格算不算獨立的元素?

解答:

只有字串才能透過 'hello'"world" 這樣的方式直接初始化。而陣列呢,必須用 [1, 2, 'three'] 這樣的形式,每個元素之間要用逗號 , 分開。至於字串裡的空格嘛,它只是字串的一部分,不是一個單獨的元素。

示例:

// 初始化字串
let str = "Hello";

// 初始化陣列
let arr = [1, 2, 3];

二、長度屬性

提問:

  • 陣列和字串的長度怎麼獲取?是不是都叫 .length 呢?

解答:

沒錯,兩者獲取長度的方法都叫做 .length,但是,千萬記得這是它們各自的屬性,並不是通用的!

示例:

let str = "Hello";
let arr = [1, 2, 3];

console.log(str.length); // 5
console.log(arr.length); // 3

三、索引訪問

提問:

  • 怎麼訪問陣列或字串的第一個和最後一個元素?

  • 訪問字串和陣列的方式是不是一樣的?

解答:

第一個元素訪問很簡單,不管是陣列還是字串,都是 arr[0] 或者 str[0]。最後一個元素嘛,陣列是 arr[arr.length - 1],字串是 str[str.length - 1]。訪問方式是一樣的,都是用方括號加下標,不過,字串返回的是單個字元,陣列可是任何型別的資料!

示例:

let str = "Hello";
let arr = [1, 2, 3];

console.log(str[0]); // "H"
console.log(arr[0]); // 1
console.log(str[str.length - 1]); // "o"
console.log(arr[arr.length - 1]); // 3

四、遍歷與迭代

提問:

  • 遍歷陣列和字串有什麼常用的方法?它們完全一樣嗎?

  • 怎樣區分 for...of 和 for...in

解答:

陣列可以用 for 迴圈、for...offorEach() 遍歷,字串也差不多,但因為它是不可變的字元序列,所以 for...of 更常用。至於 for...in,它更適合用於物件,包括陣列獲取鍵值,但在字串上用的話,會遍歷每個字元的索引。

示例:

let str = "Hello";
let arr = [1, 2, 3];

for (let char of str) {
  console.log(char);
}
for (let elem of arr) {
  console.log(elem);
}

五、拼接與連線

提問:

  • 陣列和字串拼接方法有何不同?誰有 join() 方法?

  • 字串可以用 + 拼接,那陣列呢?

解答:

字串拼接用 + 就行了,如 str1 + str2。陣列則用 join() 方法把元素連起來,比如 arr.join(',')。陣列不能直接用 + 拼接,但兩個陣列相加會被轉成字串再拼接,這不是陣列的拼接,而是字串拼接行為。

示例:

let str1 = "Hello";
let str2 = "World";
let arr = ['Hello', 'World'];

console.log(str1 + " " + str2); // "Hello World"
console.log(arr.join("-")); // "Hello-World"

六、切割方法

這部分對於我個人來說最容易混淆,不知道大家怎麼樣。總之先解答提問前,我先把所涵蓋的方法都基本地介紹一下。

提問:

  • 陣列的 splice 和 slice 方法有什麼區別?

  • 字串的 split 和 slice 方法又分別是什麼?

基礎知識:

  • 一、陣列地splice 方法

    splice 返回一個包含被刪除元素的新陣列。如果未刪除任何元素,則返回空陣列。

    1. start - 要新增/刪除專案的起始位置。

    2. deleteCount (可選) - 從 start 開始要刪除的項數。如果設為 0 或省略,則不會刪除任何元素。

    3. item1, ..., itemX (可選) - 要新增到陣列中的新元素。如果沒有提供,則只會刪除元素。

  • 二、陣列的 slice 方法

    slice 返回一個新的陣列,包含了從開始到結束的所有元素的淺複製。原始陣列不會被修改。

    1. start (可選) - 開始切片的位置。如果省略,那麼切片開始於陣列的第一個元素。

    2. end (可選) - 切片結束的位置(不包括此位置)。如果省略,那麼切片會一直持續到陣列的最後一個元素。

  • 三、字串的 split 方法

    split 返回一個由子字串組成的陣列,這些子字串是透過將字串分割成多個部分建立的,分割依據是提供的分隔符或模式。

    1. separator - 一個字串或正規表示式,作為確定拆分點的模式。

    2. limit (可選) - 最大分割次數。如果省略,則所有可能的分割都會執行。

  • 四、字串的 slice 方法

    slice 返回一個新的字串,這個字串是從原字串中切片得到的。

    1. start - 開始切片的位置。

    2. end (可選) - 結束切片的位置(不包括此位置)。

回憶完了上面地內容,再來看看下面的解答是不是這麼回事吧。

解答:

陣列的 splice 方法允許你向陣列中新增或移除專案,同時返回被移除的專案。它會改變原陣列。而 slice 方法則是從已有的陣列中返回選定的元素到一個新的陣列,原陣列不會被修改。

字串的 split 方法是將字串分割成字串陣列,而 slice 方法則用於提取字串的某個部分,並以新的字串形式返回。

示例:

// 陣列的 splice 和 slice 方法
let numbers = [1, 2, 3, 4, 5];
let removedElements = numbers.splice(1, 2); // 移除索引1和2的元素

console.log(numbers); // [1, 4, 5]
console.log(removedElements); // [2, 3]

let slicedNumbers = numbers.slice(0, 2); // 從索引0開始到索引1,不包括2

console.log(slicedNumbers); // [1, 4]

// 字串的 split 和 slice 方法
let text = "Hello, World!";
let words = text.split(", "); // 根據逗號和空格分割

console.log(words); // ["Hello", "World!"]

let partOfText = text.slice(7, 12); // 提取索引7到11的字元,不包括12

console.log(partOfText); // "World"

七、相互轉換

提問:

  • 怎麼把陣列變成字串?反過來呢?

解答:

陣列可以呼叫 toString()join() 變成字串。字串可以透過 Array.from()str.split('') 轉換為陣列。

示例:

let arr = [1, 2, 3];
let str = arr.toString();

console.log(str); // "1,2,3"

let str2 = "Hello";
let arr2 = Array.from(str2);

console.log(arr2); // ["H", "e", "l", "l", "o"]

八、進階技巧

提問:

  • 怎樣動態拼接陣列?字串的模板字面量是什麼?

解答:

使用 reduce() 方法可以動態構建字串,配合 slice() 調整格式。模板字面量 (`) 可以在字串中嵌入變數,使用 ${} 插入變數值,讓字串構造更直觀。

示例:

let arr = [1, 2, 3];
let str = arr.reduce((acc, curr) => acc + '-' + curr, '').slice(1);

console.log(str); // "1-2-3"

let name = "John";
let greeting = `Hello, ${name}!`;

console.log(greeting); // "Hello, John!"

結語

透過這篇文章,希望我們都能更清楚地理解陣列與字串的特性,不再在處理它們的時候感到迷茫。記得,多動手練習,才能真正掌握這些知識。一起加油!

0則評論

您的電子郵件等資訊不會被公開,以下所有項目均必填

OK! You can skip this field.