在開發過程中,有時候會使用 JavaScript 刪除字串來處理前端路由字串、API 回傳路徑或是清理使用者輸入時,經常會遇到需要「移除字串第一個字元」的需求。最常見的實作方式便是透過內建的 substring() 與 slice() 方法來達成。本文將詳細比較這兩種語法的差異、極端邊界條件的處理方式,並提供實用的程式碼範例與語法速查,幫助你在不同情境下選擇最合適的解法。
⚡ 快速跳轉:若想直接看可用程式碼與語法對照,可直接參考下方 JavaScript 刪除第一個字元語法速查表。
JavaScript 刪除第一個字元語法速查表
以下是 substring() 與 slice() 在處理字串移除首字時的規格對照與行為差異:
| 方法 | 核心語法 | 傳入負數索引行為 | 建議使用情境 |
|---|---|---|---|
substring(1) | str.substring(1) | 負數會自動被視為 0 處理 | 一般字串裁切、確保不因負數出錯 |
slice(1) | str.slice(1) | 從字串尾端開始倒數計算索引 | 慣用的現代 JavaScript 開發寫法 |
1. 使用 substring() 刪除第一個字元
substring() 方法會傳回從起始索引到結束索引(不包含結束索引)之間的字串。當我們傳入 1 作為參數時,它會從索引位置 1 開始擷取,直到字串結尾,等於直接剔除了索引為 0 的第一個字元。
const str = '/test-string';
const result = str.substring(1);
console.log(result);
// Expected output: "test-string"
substring() 邊界條件注意事項
當傳入的字串為空字串 "" 或僅有一個字元時,執行 str.substring(1) 會安全地傳回空字串 "",不會引發例外錯誤。但若需要傳入變數進行防禦性檢查,建議加上型別確認:
function removeFirstChar(str) {
if (typeof str !== 'string' || str.length === 0) {
return '';
}
return str.substring(1);
}
console.log(removeFirstChar("")); // Expected output: ""
console.log(removeFirstChar("A")); // Expected output: ""
2. 使用 slice() 刪除第一個字元
slice() 方法同樣可以用來提取字串的一部分。傳入 str.slice(1) 代表從索引 1 開始擷取到最後。由於其語法簡潔且效能表現優異,是許多前端工程師在處理字串裁切時的首選。
const str = '/test-string';
const result = str.slice(1);
console.log(result);
// Expected output: "test-string"
slice() 與 substring() 的主要差異
slice() 與 substring() 在多數一般字串操作下結果相同,但最大差異在於對「負數索引」的處理方式:
str.slice(-1)會從字串結尾倒數取回最後一個字元。str.substring(-1)會將負數自動轉換為0,等於傳入0進行擷取(即傳回完整字串)。
因此,當明確只要移除第一個字元時,使用 slice(1) 搭配防禦性檢查是極為穩健的寫法。
3. 生產環境完整防禦性程式碼範例
在實際的專案開發中,字串來源可能是 null、undefined 或非字串型別。為了避免程式因為型別錯誤而當機,建議包裝成共用函式來處理:
/**
* 安全地刪除字串中的第一個字元
* @param {string} inputStr - 目標字串
* @returns {string} 處理後的字串
*/
function safeRemoveFirstChar(inputStr) {
// 防禦機制:檢查是否為有效字串且長度大於 0
if (!inputStr || typeof inputStr !== 'string') {
return '';
}
return inputStr.slice(1);
}
// 測試案例
console.log(safeRemoveFirstChar('/api/v1/users')); // "api/v1/users"
console.log(safeRemoveFirstChar('A')); // ""
console.log(safeRemoveFirstChar('')); // ""
console.log(safeRemoveFirstChar(null)); // ""
4. 開發者高頻 Q&A
Q1:如果字串的第一個字元是特殊符號或中文,slice(1) 還能正常運作嗎?
可以。JavaScript 的字串索引是以 UTF-16 單元計算。對於常見的中文或特殊符號(一般 BMP 字元),slice(1) 或 substring(1) 都能正確移除第一個字元。不過若遇到包含 Surrogate Pairs(如部分 Emoji)的字串,單純切索引可能會切斷位元組,若有處理 Emoji 需求建議使用 Array.from(str).slice(1).join('')。
Q2:substring(1) 和 slice(1) 哪一個效能比較好?
在現代 JavaScript 引擎(如 V8)中,兩者的效能幾乎沒有顯著差異。選擇時主要取決於團隊慣用的Coding Style,但 slice() 在處理陣列與字串時的語意一致性較高,因此在實務上更為常見。
Q3:除了 substring 和 slice,還有其他方法可以刪除第一個字元嗎?
有的,例如使用正規表達式 str.replace(/^./, ''),或是將字串轉為陣列後使用 destructuring assignment(解構賦值):
const [first, ...rest] = '/test-string';
const result = rest.join('');
console.log(result); // "test-string"
但在只需移除單一首字的單純場景下,slice(1) 依然是效能與可讀性最好的解法。
發表迴響