Nach der Frage Erweitern der Leistung von String.prototype bin ich wirklich fasziniert, weil das Hinzufügen "use strict"
zu einer String.prototype
Methode die Leistung zehnmal verbessert hat. Die Erklärung von Bergi ist kurz und erklärt es mir nicht. Warum gibt es einen so dramatischen Unterschied zwischen zwei fast identischen Methoden, die sich nur oben unterscheiden "use strict"
? Können Sie das genauer und mit der Theorie dahinter erklären?
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');
Ergebnis:
proto: 101 ms
proto-strict: 7.5 ms
this[i] === char
in einer DOM-Umgebung getestet und das Ergebnis ist das gleiche
count
Funktion der this
Parameter in ein Zeichenfolgenobjekt anstatt in ein Zeichenfolgenliteral umgewandelt werden muss, während dies im strengen Modus nicht erforderlich ist, um ordnungsgemäß zu funktionieren. Warum dies der Fall ist, ist mir ein Rätsel. Die Antwort interessiert mich sehr.
this
, aber im strengen Modus wird dieser Schritt übersprungen, sodass Sie die primitive Zeichenfolge oder was auch immer vorgesehen ist this
.
"use strict";
überall Jungs zu platzieren! Goooold
this[i] === char
und sehen, ob Sie den gleichen Unterschied bekommen?