メソッドに追加するだけでパフォーマンスが10倍向上したため、「Extending String.prototype performance」という質問に私は本当に興味をそそられます。説明によるbergiは短く、私にそれを説明していません。2つのほぼ同一の方法の間に劇的な違いがあるのはなぜですか?より詳細に、そしてその背後にある理論で説明できますか?"use strict"
String.prototype
"use strict"
String.prototype.count = function(char) {
var n = 0;
for (var i = 0; i < this.length; i++)
if (this[i] == char) n++;
return n;
};
String.prototype.count_strict = function(char) {
"use strict";
var n = 0;
for (var i = 0; i < this.length; i++)
if (this[i] == char) n++;
return n;
};
// Here is how I measued speed, using Node.js 6.1.0
var STR = '0110101110010110100111010011101010101111110001010110010101011101101010101010111111000';
var REP = 1e4;
console.time('proto');
for (var i = 0; i < REP; i++) STR.count('1');
console.timeEnd('proto');
console.time('proto-strict');
for (var i = 0; i < REP; i++) STR.count_strict('1');
console.timeEnd('proto-strict');
結果:
proto: 101 ms
proto-strict: 7.5 ms
私
—
CristianTraìna16年
this[i] === char
はDOM環境でテストしましたが、結果は同じです
bergiの説明によると、
—
Nick Larsen
count
関数を呼び出すとき、this
パラメーターは文字列リテラルではなく文字列オブジェクトにキャストする必要がありますが、厳密モードでは正しく動作するためにパラメーターをキャストする必要はありません。なぜこれが当てはまらないのか、私は答えに非常に興味があります。
@NickLarsen:言語が仕様化された方法です。従来、JSはオブジェクトが常にであることを確認していました
this
が、厳密モードではそのステップをスキップするため、プリミティブ文字列、またはに提供されたものを取得しますthis
。
"use strict";
男の子をどこにでも置く時間です!グーオールド
this[i] === char
行い、同じ違いが得られるかどうかを確認できますか?