A seguito della domanda sull'estensione delle prestazioni di String.prototype, sono davvero incuriosito, perché l'aggiunta "use strict"
a un String.prototype
metodo ha migliorato le prestazioni 10 volte. La spiegazione di Bergi è breve e non me la spiega. Perché c'è una differenza così drammatica tra due metodi quasi identici, che differiscono solo nella "use strict"
parte superiore? Puoi spiegare in modo più dettagliato e con la teoria alla base di questo?
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');
Risultato:
proto: 101 ms
proto-strict: 7.5 ms
this[i] === char
un ambiente DOM e il risultato è lo stesso
count
funzione, il this
parametro deve essere lanciato su un oggetto stringa anziché su un valore letterale stringa mentre in modalità rigorosa non è necessario per funzionare correttamente. Perché questo è il caso oltre me, sono molto interessato alla risposta.
this
, ma in modalità rigorosa salta quel passaggio, in modo da ottenere la stringa primitiva o qualsiasi cosa fosse prevista this
.
"use strict";
ovunque ragazzi! Goooold
this[i] === char
e vedere se ottieni la stessa differenza?