String.prototype performansını genişletme sorusunun ardından gerçekten meraklandım , çünkü "use strict"bir String.prototypeyönteme sadece 10 kat daha iyi performans ekledim . Açıklama ile Bergi kısadır ve bana açıklamaz. Neredeyse aynı iki yöntem arasında neden yalnızca "use strict"en üstte farklılık gösteren bu kadar çarpıcı bir fark var ? Daha detaylı olarak ve bunun arkasındaki teori ile açıklayabilir misiniz?
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');
Sonuç:
proto: 101 ms
proto-strict: 7.5 ms
this[i] === charBir DOM ortamında test ettim ve sonuç aynı
countişlevi çağırdığınızda, thisparametrenin bir dizge değişmezi yerine bir dizge nesnesine dönüştürülmesi gerektiğini, ancak katı modda doğru şekilde çalışması için gerekli olmadığını söyler . Neden bu durum benim dışımda, cevapla çok ilgileniyorum.
this, ancak katı modda bu adımı atlar, böylece ilkel dizeyi veya sağlanan her şeyi elde edersiniz this.
"use strict";çocuklar! Goooold
this[i] === charyapıp aynı farkı alıp almadığınızı görebilir misiniz?