2016-05-11 2 views
3

:私の知る限り、私はまた、ループを避けるために、このようにそれを書くことができます知っているようループ単一の文に、我々は次の行持っている私たちのアプリケーションの一つで

while (text.indexOf(' ') !== -1) 
    text = text.replace(' ', '_'); 
while (text.indexOf('*') !== -1) 
    text = text.replace('*', 'x'); 

text = text.replace(/ /g, '_'); 
text = text.replace(/*/g, 'x'); 

2つのバージョンのより良いプログラミングスタイルでしょうか?これら2つの間に違い(パフォーマンス、結果、エラー、...)はありますか?可能であれば、ループを回避する必要がありますか?

+8

最初のものは 'replaceAll'を実装する学校の子供の方法です:

アンでもよりよい解決策は、次のようにそれらをチェーンにあります。 –

+3

2番目の方がより簡潔で、速く、短く、より良いです。 –

+1

@NumLock JavaScriptには 'replaceAll'メソッドがありません。上のコードはカスタム実装で見つかるかもしれません。 –

答えて

3

正規表現を使用すると、新鮮な(経験の浅い/経験の浅い)開発者が幾分混乱することに気付きました。だから、最初の選択肢が読んで理解しやすくなり、何をしているのかが分かります。

しかし、第2のオプションは次のとおりです。

  • 短く簡潔な、また読みやすい(提供、あなたが正規表現に精通しています)。
  • 理論的には、ループコードに文字列変数を再割り当てするように依頼するのではなく、ネイティブコードですべての重い作業を行うようにするので、理論的には高速にする必要があります。しかし、正規表現には非効率につながるオーバーヘッドがあります。しかし、実際のシナリオ、特にこの場合は適用されません(顕著)。

正規表現の文字列を間違えてもエラーが発生しても、エラーは発生しません。皮肉なことに、あなたはしました(特殊文字*をエスケープする必要があります)。したがって、オプション1を選択する理由の1つは次のとおりです。

text.replace(/\*/g, 'x'); 
1

2番目のオプションはありません。回避することができればループを起動しないでください。 Javascriptは関数型言語です。これを使って!

text = text.replace(/ /g, "_").replace(/\*/g, "x"); 
関連する問題