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的评论以及他对安全反向方法的回答.
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)
String.prototype.reverse = function () {
return this.split("").reverse().join("");
}
Run Code Online (Sandbox Code Playgroud)
受到第一个结果的启发,当我用谷歌进行javascript字符串反转时,我得到了第一个结果.