После вопроса « Расширение производительности String.prototype» я был очень заинтригован, потому что простое добавление "use strict"к String.prototypeметоду улучшило производительность в 10 раз. Объяснение по Бергам коротко и не объясняет мне. Почему существует такая резкая разница между двумя почти идентичными методами, которые отличаются только "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
this[i] === charв среде DOM, и результат тот же
countфункцию, thisпараметр должен быть приведен к строковому объекту, а не к строковому литералу, тогда как в строгом режиме это не обязательно для правильной работы. Почему это так, мне непонятно, мне очень интересен ответ.
this, но в строгом режиме он пропускает этот шаг, поэтому вы получаете примитивную строку или все, что было предусмотрено this.
"use strict";везде мальчиков! Goooold
this[i] === charи увидеть, получите ли вы такую же разницу?