Suite à la question Extension des performances de String.prototype, je suis vraiment intrigué, car le simple fait d'ajouter "use strict"
à une String.prototype
mé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] === char
dans un environnement DOM et le résultat est le même
count
fonction, le this
paramè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] === char
et voir si vous obtenez la même différence?