Після запитання Розширення продуктивності 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
і побачити, чи отримаєте ви однакову різницю?