在 JavaScript 中反转字符串

IT技术 javascript string
2021-02-07 23:09:05

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

var oneway = document.getElementById('input_field').value();
var backway = oneway.reverse();

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

谢谢

6个回答

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

var backway = oneway.split("").reverse().join("");

更新

上面的方法只对“常规”字符串是安全的。请参阅下面 Mathias Bynens 的评论以及对安全反向方法的回答

对于包含星形 Unicode 符号的字符串,即基本多语言平面之外的字符,这被破坏了。对于包含组合字符的字符串,它也会给出有趣的结果,例如分音符可能出现在以下字符上。第一个问题将导致“无效”字符串(任何星体符号的代理对的顺序错误),第二个问题将导致看起来很有趣的有效字符串。我的回答对这两个问题都有解决方案:stackoverflow.com/a/16776380/96656
2021-03-31 23:09:05

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

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

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

naiveReverse('foo 𝌆 bar');
// → 'rab �� oof'
// Where did the `𝌆` symbol go? Whoops!

如果您想知道为什么会发生这种情况,请阅读 JavaScript 的内部字符编码(TL;DR:𝌆是一个星体符号,JavaScript 将它公开为两个独立的代码单元。)

但还有更多:

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

测试字符串反向实现的好字符串如下

'foo 𝌆 bar mañana mañana'

为什么?因为它包含一个星形符号 ( 𝌆)(在 JavaScript 中由代理对表示)和一个组合标记(最后一个mañana实际上由两个符号组成:U+006E LATIN SMALL LETTER N 和 U+0303 COMBINING TILDE)。

代理对出现的顺序不能颠倒,否则星体符号将不再出现在“颠倒”字符串中。这就是您��在上一个示例的输出中看到这些标记的原因

组合标记始终应用于前一个符号,因此您必须将主符号(U+006E LATIN SMALL LETTER N)视为组合标记(U+0303 COMBINING TILDE)作为一个整体。颠倒它们的顺序将导致组合标记与字符串中的另一个符号配对。这就是为什么示例输出有而不是ñ.

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


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

var input = 'foo 𝌆 bar mañana mañana';
esrever.reverse(input);
// → 'anañam anañam rab 𝌆 oof'
String.prototype.reverse = function () {
    return this.split("").reverse().join("");
}

灵感来自我在谷歌搜索javascript string reverse时得到的第一个结果

谷歌更难,兄弟。这是艾德·曼 (Edd Mann) 的作品。

function reverse (s) {
for (var i = s.length - 1, o = ''; i >= 0; o += s[i--]) { }
return o;
}

http://eddmann.com/posts/ten-ways-to-reverse-a-string-in-javascript/

http://jsperf.com/string-reverse-function-performance

编辑:实际上我撒了谎,我能够通过稍微修改它来击败它。=)
2021-03-22 23:09:05
这是其中最快的一个!我试图将它与一个 while 循环相匹配,但可惜我无法击败它的表现。jsperf.com/string-reverse-methods-performance
2021-03-28 23:09:05

reverse是一个数组上的函数,它是一个字符串。您可以将字符串分解为一个数组,然后将其反转,然后将其重新组合在一起。

var str     = '0123456789';
var rev_str = str.split('').reverse().join('');