使用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);
|
使用split
和join
方法
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(""));
|
使用正则表达式的s
和u
标志
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)
是处理短字符串和长字符串最快或较快的解决方案,是推荐的跨浏览器快速解决方案。- 基于
substring
和substr
的解决方案速度较快。 - 基于正则表达式的解决方案速度较慢或中等。
- 部分解决方案在处理长字符串时性能较差。
以下是性能测试涉及的函数:
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
或扩展运算符...
结合slice
和join
方法。 - 需要条件去除特定后缀时,使用
substring
结合条件判断。
常见问题
非Unicode感知问题
String.prototype.{ split, slice, substr, substring }
等方法操作的是UTF - 16编码的字符串,对于包含代理对的高Unicode码点,这些方法可能无法正确处理。可以使用字符串迭代器或正则表达式的u
标志来解决。
正则表达式匹配行尾问题
传统的正则表达式方法在匹配行尾的换行符时可能会出现问题,可以使用正则表达式的s
标志来解决。