JavaScript 从浅入深 100 题训练计划--(24)字符串反转
reverseString("hello") // "olleh"
reverseString("👋🌍") // "🌍👋"
⚠️ 关键坑:Unicode 字符(emoji、中文组合字符)
问题:split('') 会破坏 emoji 和特殊字符
- emoji(如 😀)在 JavaScript 内部用 两个 UTF-16 码元(surrogate pair) 表示
split('')按码元切分,会把 emoji 劈成两半[...str]和Array.from()按**码点(code point)**切分,能正确识别 emoji
1 // "e\u0301" = é(e + 组合重音符号,两个码点) 2 const str = 'e\u0301'; 3 4 [...str].reverse().join(''); // "\u0301e" ← 符号跑到前面了,视觉上还是错的 5 6 // 终极解决方案:用 Intl.Segmenter 按"字素簇"切分 7 const segmenter = new Intl.Segmenter('zh', { granularity: 'grapheme' }); 8 const reversed = [...segmenter.segment(str)].reverse().map(s => s.segment).join('');
1 function reverseString(str) { 2 // return [...str].reverse().join(''); 3 return Array.from(str).reverse().join(''); 4 } 5 6 function reverseString(str) { 7 const chars = [...str]; 8 let result = ''; 9 10 for (let i = chars.length - 1; i >= 0; i--) { 11 result += chars[i]; 12 } 13 14 return result; 15 } 16 17 18 // 双指针 19 function reverseString(str) { 20 return [...str].reduce((acc, char) => char + acc, ''); 21 } 22 23 function reverseString(s) { // s 是字符数组,如 ["h","e","l","l","o"] 24 let left = 0; 25 let right = s.length - 1; 26 27 while (left < right) { 28 [s[left], s[right]] = [s[right], s[left]]; // 交换 29 left++; 30 right--; 31 } 32 return s; 33 } 34 35 // 手动处理Unicode 36 37 function reverseStringUnicode(str) { 38 const result = []; 39 40 for (let i = str.length - 1; i >= 0; i--) { 41 const charCode = str.charCodeAt(i); 42 43 // 处理代理对(Surrogate Pair) 44 if (charCode >= 0xDC00 && charCode <= 0xDFFF && i > 0) { 45 const highSurrogate = str.charCodeAt(i - 1); 46 if (highSurrogate >= 0xD800 && highSurrogate <= 0xDBFF) { 47 result.push(str[i - 1] + str[i]); 48 i--; 49 continue; 50 } 51 } 52 53 result.push(str[i]); 54 } 55 56 return result.join(''); 57 }

浙公网安备 33010602011771号