使用JavaScript去除字符串最后一个字符的方法

使用JavaScript去除字符串最后一个字符的方法

技术背景

在JavaScript编程中,经常会遇到需要去除字符串最后一个字符的场景,例如处理用户输入、格式化数据等。本文将介绍多种实现该功能的方法,并对它们的性能进行测试。

实现步骤

使用substring方法

1
2
3
let str = "12345.00";
str = str.substring(0, str.length - 1);
console.log(str);

使用slice方法

1
2
3
let str = "12345.00";
str = str.slice(0, -1);
console.log(str);

使用正则表达式

1
2
3
let aStr = "12345.00";
aStr = aStr.replace(/.$/, '');
console.log(aStr);

使用splitjoin方法

1
2
3
4
let myString = "hello i'm a string";
let strArr = myString.split("");
strArr.pop();
console.log(strArr.join(""));

条件去除特定后缀

1
2
3
4
5
let str = "foo_bar";
if (str.substring(str.length - 4) === "_bar") {
str = str.substring(0, str.length - 4);
}
console.log(str);

处理Unicode字符串

1
2
3
const string = "ẞ🦖";
console.log(Array.from(string).slice(0, -1).join(""));
console.log([...string].slice(0, -1).join(""));

使用正则表达式的su标志

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const unicodeString = "ẞ🦖",
lineBreakString = "Hello, world!\n";

console.log(lineBreakString.replace(/.$/s, "").endsWith("\n"));
console.log(lineBreakString.match(/(.*).$/s) === null);
console.log(unicodeString.replace(/.$/su, ""));
console.log(unicodeString.match(/(.*).$/su)[1]);

const unicodeCharacterArray = unicodeString.split(/(?:)/su),
lineBreakCharacterArray = lineBreakString.split(/(?:)/su);

unicodeCharacterArray.pop();
lineBreakCharacterArray.pop();
console.log(unicodeCharacterArray.join(""));
console.log(lineBreakCharacterArray.join("").endsWith("\n"));

性能测试

在2020.05.13,对多种解决方案在Chrome v81.0、Safari v13.1和Firefox v76.0以及MacOs High Sierra v10.13.6上进行了性能测试,得出以下结论:

  • slice(0,-1)是处理短字符串和长字符串最快或较快的解决方案,是推荐的跨浏览器快速解决方案。
  • 基于substringsubstr的解决方案速度较快。
  • 基于正则表达式的解决方案速度较慢或中等。
  • 部分解决方案在处理长字符串时性能较差。

以下是性能测试涉及的函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
function A(str) {
return str.replace(/.$/, '');
}

function B(str) {
return str.match(/(.*).$/)[1];
}

function C(str) {
return str.substring(0, str.length - 1);
}

function D(str) {
return str.slice(0, -1);
}

function E(str) {
return str.substr(0, str.length - 1);
}

function F(str) {
let s = str.split("");
s.pop();
return s.join("");
}

function G(str) {
let s = '';
for (let i = 0; i < str.length - 1; i++) s += str[i];
return s;
}

// 测试
let log = (f) => console.log(`${f.name}: ${f("12345.00")}`);
[A, B, C, D, E, F, G].map(f => log(f));

最佳实践

  • 对于大多数情况,推荐使用slice(0, -1)方法,因为它简洁且性能较好。
  • 处理Unicode字符串时,使用Array.from或扩展运算符...结合slicejoin方法。
  • 需要条件去除特定后缀时,使用substring结合条件判断。

常见问题

非Unicode感知问题

String.prototype.{ split, slice, substr, substring }等方法操作的是UTF - 16编码的字符串,对于包含代理对的高Unicode码点,这些方法可能无法正确处理。可以使用字符串迭代器或正则表达式的u标志来解决。

正则表达式匹配行尾问题

传统的正则表达式方法在匹配行尾的换行符时可能会出现问题,可以使用正则表达式的s标志来解决。


使用JavaScript去除字符串最后一个字符的方法
https://119291.xyz/posts/2025-05-13.javascript-remove-last-character-in-string/
作者
ww
发布于
2025年5月13日
许可协议