Suite à la question Extension des performances de String.prototype, je suis vraiment intrigué, car le simple fait d'ajouter "use strict"à une String.prototypeméthode améliore les performances 10 fois. L' explication de bergi est courte et ne me l'explique pas. Pourquoi y a-t-il une différence si dramatique entre deux méthodes presque identiques, qui ne diffèrent que par "use strict"le haut? Pouvez-vous expliquer plus en détail et avec la théorie derrière cela?
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');
Résultat:
proto: 101 ms
proto-strict: 7.5 ms
this[i] === chardans un environnement DOM et le résultat est le même
countfonction, le thisparamètre doit être converti en un objet chaîne au lieu d'une chaîne littérale alors qu'en mode strict, il n'est pas nécessaire de le faire pour fonctionner correctement. Pourquoi c'est le cas me dépasse, je suis très intéressé par la réponse.
this, mais en mode strict, il saute cette étape, vous obtenez donc la chaîne primitive , ou tout ce qui a été prévu this.
"use strict";partout les garçons! Goooold
this[i] === charet voir si vous obtenez la même différence?