次のような技術(または類似):あなたはこれを実現する方法を知りたい場合は、最初の配列に変換
// Don’t use this!
var naiveReverse = function(string) {
return string.split('').reverse().join('');
}
実際、これまでに投稿されたすべての回答は、このパターンのバリエーションです。しかし、この解決策にはいくつか問題があります。たとえば、次のように
naiveReverse('foo bar');
// → 'rab �� oof'
// Where did the `` symbol go? Whoops!
これがなぜ起こるかあなたは迷っている場合は、read up on JavaScript’s internal character encoding。 (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.
良いストリングテスト列に実装リバースthe followingある:
'foo bar mañana mañana'
なぜですか?それはアストラルシンボル(
)(これはrepresented by surrogate pairs in JavaScriptです)とコンビネーションマーク(最後のmañana
のñ
は実際にはU + 006E LATIN SMALL LETTER NとU + 0303 COMBINING TILDEの2つのシンボルで構成されています)が含まれているためです。
サロゲートペアが表示される順番を逆にすることはできません。それ以外の場合、アストラルシンボルは「反転」文字列に表示されなくなります。そのため、前の例の出力には��
のマークが表示されています。
結合記号は常に前の記号に適用されるため、全体として結合記号(U + 0303 COMBINING TILDE)としてメイン記号(U + 006E LATIN SMALL LETTER N)の両方を扱わなければなりません。その順序を逆にすると、合成マークが文字列の別のシンボルとペアになります。そのため、出力例はñ
ではなくã
でした。
これは、これまでに投稿されたすべての回答がが間違っている理由を説明しています。です。[適切] JavaScriptを内の文字列を逆にする方法を- -
はあなたの最初の質問に答えるために、私は、Unicode対応の文字列の反転が可能な小型のJavaScriptライブラリを書いています。私が言及した問題はありません。ライブラリはEsreverと呼ばれます。そのコードはGitHub上にあり、ほとんどのJavaScript環境で動作します。シェルユーティリティ/バイナリが付属していますので、必要に応じて端末から簡単に文字列を取り消すことができます。 var input = 'foo bar mañana mañana';
esrever.reverse(input);
// → 'anañam anañam rab oof'
_ "その他の配列メソッド" _は '.sort()'を実行しますか?うまくいくものは、すべてのブラウザで動作しますか? (私はそれをテストしていませんが、文字列の配列型 '[]'インデックス表記法を実装していない古いブラウザでは失敗すると思います) – nnnnnn
@nnnnnnソートは同じ理由で正しく動作しません – Hai
@Hai:FYI、 '.splice()'は実際には機能しません。 Chromeは返された値を返すほど親切ですが、スプライスする前に元の文字列を参照すると、変更されていないことがわかります。 –