2012-01-15 4 views
7

なぜコール[] .reverse文字列に

[].reverse.call("string"); 

が(両方のFirefoxでエラーをし、すなわち、クロムで元の文字列を返します)失敗した文字列の作業上の他のすべての配列のメソッドを呼び出し中にいますか?

>>> [].splice.call("string",3) 
["i", "n", "g"] 
>>> [].map.call("string",function (a) {return a +a;}) 
["ss", "tt", "rr", "ii", "nn", "gg"] 
+0

_ "その他の配列メソッド" _は '.sort()'を実行しますか?うまくいくものは、すべてのブラウザで動作しますか? (私はそれをテストしていませんが、文字列の配列型 '[]'インデックス表記法を実装していない古いブラウザでは失敗すると思います) – nnnnnn

+0

@nnnnnnソートは同じ理由で正しく動作しません – Hai

+0

@Hai:FYI、 '.splice()'は実際には機能しません。 Chromeは返された値を返すほど親切ですが、スプライスする前に元の文字列を参照すると、変更されていないことがわかります。 –

答えて

8

.reverse()は配列を変更し、文字列は不変であるためです。


Array.prototype.sliceを借りて、配列に変換して逆にして結合することができます。

var s = "string"; 

var s2 = [].slice.call(s).reverse().join(''); 

IEの古いバージョンでは、配列のような文字列を操作することはできません。

+1

よくできました - 簡潔さはウィットの精神です –

+1

@AdamRackis:ありがとうございましたが、今は補足してしまいました。 :) –

+0

@amnotiam、あまりにも遅く、申し訳ありません。 – OnTheFly

4

私はそれがうまくいかない理由については私の答えです。一般的にJavaScriptで文字列を逆にするために使用される

"string".split('').reverse().join(''); // "gnirts" 
+0

+1 '.split()'は '[] .slice()'よりもブラウザ互換の配列変換になります。 –

5

次のような技術(または類似):あなたはこれを実現する方法を知りたい場合は、最初の配列に変換

// 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' 
関連する問題