ホームページ  >  記事  >  ウェブフロントエンド  >  JavaScript 文字列乗算_JavaScript スキル

JavaScript 文字列乗算_JavaScript スキル

WBOY
WBOYオリジナル
2016-05-16 18:47:561404ブラウズ

元のアドレス: http://www.davidflanagan.com/2009/08/string-multipli.html
原著者: David Flanagan
Ruby で、「*」演算子は、左側のパラメータとして文字列を使用し、右側のパラメータとして数値を使用して、文字列の繰り返しを実装します。たとえば、「Ruby」 * 2 の値は「RubyRuby」です。これは限られた場所でしか役に立ちません (たとえば、ハイフンなどの ASCII 文字のテーブルの生成など) が、非常に簡潔です。また、文字列を n 回連結するループを作成するよりも優れています (非常に非効率的と思われます)。

JavaScript で文字列の乗算を行うための賢いトリックを発見しました:


String.prototype.times = function(n) {
return Array.prototype.join.call({length:n 1}, this); ;
"js".times(5) // => "jsjsjsjsjs"


このメソッドは、要素がすべて「未定義」である配列を呼び出します。行動。ただし、実際には、n 1 個の「未定義」要素を含む配列は作成されません。これは、Array オブジェクトのプロトタイプ関数 join() に依存して、長さプロパティを含む匿名オブジェクトを使用します。 「Object」は配列ではないため、join() を直接呼び出すことができないため、プロトタイプの call() を通じて実装する必要があります。同じ効果を持つ単純なバージョンを以下に示します。


コードをコピーします コードは次のとおりです:
String.prototype.times = function(n) { return (new Array(n 1)).join(this);};

配列のコンストラクターを 1 つで呼び出すときパラメータは配列の長さを設定するだけで、実際に配列の要素を作成するわけではありません。

私は Firefox でのみテストしており、通常のループよりも効率的であると推定していますが、ベンチマークは行っていません。

著者について
David Flanagan は、Java の執筆に熱中しているコンピューター プログラマーです。Java 関連の本の執筆にほとんどの時間を費やしています。 David は、MIT でコンピューター サイエンスとエンジニアリングの学位を取得しました。彼は米国の太平洋岸北西部、シアトルとバンクーバーの間に住んでいます。オライリーのベストセラー書籍には、『Java in a Nutshell』、『Java Foundation Classes in a Nutshell』、『Java Enterprise in a Nutshell』、『JavaScript: The Definitive Guide』、『JavaScript Pocket Reference』、および『The Ruby Programming Language』などがあります。

私のコメント
効率を重視する場合は、ループの反復をわずかに最適化するとより効率的になる可能性があります。たとえば、次の再帰呼び出しのアルゴリズムの複雑さは O(log2n) です。 Google Chrome でのテスト結果は、David の方法よりも実行速度が速いということですが、彼の方法が非常にエレガントであることは認めざるを得ません。

コードをコピー コードは次のとおりです。
String.prototype.times = function(n ) {
if ( n == 1 ) {
これを返します;
}
varmidRes = this.times(Math.floor(n/2));
if ( n % 2 ) {
midRes = this;
return
}


追記
David は私の提案を採用しました。彼は私たちのために非再帰バージョンを書いてくれました。彼のブログの原文をご覧ください: http://www.davidflanagan.com/2009/08/good-algorithms.html
連絡先情報
私のメールアドレス、お気軽にお問い合わせください (redraiment@gmail.com) )
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。