在JavaScript中反转字符串

dru*_*mer 48 javascript string

我正在尝试反转输入字符串

var oneway = document.getElementById('input_field').value();
var backway = oneway.reverse();
Run Code Online (Sandbox Code Playgroud)

但是萤火虫告诉我这oneway.reverse()不是一个功能.有任何想法吗?

谢谢

Ate*_*ral 112

reverse()是一个数组实例的方法.它不会直接用于字符串.您应该首先将字符串的字符拆分为数组,反转数组,然后再连接回字符串:

var backway = oneway.split("").reverse().join("");
Run Code Online (Sandbox Code Playgroud)

更新

上述方法仅对"常规"字符串安全.请参阅以下Mathias Bynens的评论以及对安全反向方法的回答.

  • 对于包含星形Unicode符号的字符串,即基本多语言平面之外的字符,这会被破坏.它还会为包含组合字符的字符串提供有趣的结果,例如,可能会在后面的字符上显示分音符.第一个问题将导致"无效"字符串(任何星体符号的代理对以错误的顺序排列),第二个问题将导致看起来很有趣的有效字符串.我的答案有两个问题的解决方案:http://stackoverflow.com/a/16776380/96656 (23认同)

Mat*_*ens 73

以下技术(或类似)通常用于在JavaScript中反转字符串:

// Don’t use this!
var naiveReverse = function(string) {
    return string.split('').reverse().join('');
}
Run Code Online (Sandbox Code Playgroud)

事实上,到目前为止发布的所有答案都是这种模式的变体.但是,此解决方案存在一些问题.例如:

naiveReverse('foo  bar');
// ? 'rab ?? oof'
// Where did the `` symbol go? Whoops!
Run Code Online (Sandbox Code Playgroud)

如果您想知道为什么会这样,请阅读JavaScript的内部字符编码.(TL; DR: is an astral symbol, and JavaScript exposes it as two separate code units.)

But there’s more:

// To see which symbols are being used here, check:
// http://mothereff.in/js-escapes#1ma%C3%B1ana%20man%CC%83ana
naiveReverse('mañana man?ana');
// ? 'ana?nam anañam'
// Wait, so now the tilde is applied to the `a` instead of the `n`? WAT.
Run Code Online (Sandbox Code Playgroud)

A good string to test string reverse implementations is the following:

'foo  bar mañana man?ana'
Run Code Online (Sandbox Code Playgroud)

Why? Because it contains an astral symbol ()(由JavaScript中的代理对表示)和一个组合标记(n?在最后一个man?ana实际上由两个符号组成:U + 006E LATIN SMALL LETTER N和U + 0303 COMBINING TILDE).

代理对出现的顺序不能反转,否则星形符号将不再出现在"反向"字符串中.这就是您??在前一个示例的输出中看到这些标记的原因.

组合标记始终应用于上一个符号,因此您必须将主符号(U + 006E LATIN SMALL LETTER N)作为组合标记(U + 0303 COMBINING TILDE)整体处理.反转它们的顺序将使组合标记与字符串中的另一个符号配对.这就是为什么示例输出a?而不是ñ.

希望这能解释为什么到目前为止发布的所有答案都是错误的.


为了回答你的初始问题 - 如何[正确]反转JavaScript中的字符串 - ,我编写了一个能够识别Unicode的字符串反转的小型JavaScript库.它没有我刚才提到的任何问题.该图书馆名为Esrever ; 它的代码在GitHub上,几乎适用于任何JavaScript环境.它带有一个shell实用程序/二进制文件,因此如果需要,您可以轻松地从终端中反转字符串.

var input = 'foo  bar mañana man?ana';
esrever.reverse(input);
// ? 'anan?am anañam rab  oof'
Run Code Online (Sandbox Code Playgroud)


Bri*_*ell 8

String.prototype.reverse = function () {
    return this.split("").reverse().join("");
}
Run Code Online (Sandbox Code Playgroud)

受到第一个结果的启发,当我用谷歌进行javascript字符串反转时,我得到了第一个结果.