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
javascript
performance
exebook
quelle
quelle
this[i] === char
und sehen, ob Sie den gleichen Unterschied bekommen?this[i] === char
in einer DOM-Umgebung getestet und das Ergebnis ist das gleichecount
Funktion derthis
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 istthis
."use strict";
überall Jungs zu platzieren! GooooldAntworten:
Im strengen Modus muss der
this
Kontext kein Objekt sein. Wenn Sie eine Funktion für ein Nichtobjekt aufrufen,this
ist dies nur dieses Nichtobjekt.Im nicht strengen Modus wird der
this
Kontext dagegen immer zuerst in ein Objekt eingeschlossen, wenn es noch kein Objekt ist. Beispielsweise wird(42).toString()
zuerst42
einNumber
Objekt umbrochen und dannNumber.prototype.toString
mit demNumber
Objekt alsthis
Kontext aufgerufen. Im strikten Modus derthis
ist Kontext unberührt und nur Anrufe linksNumber.prototype.toString
mit42
alsthis
Kontext.In Ihrem Fall verbringt die Version im nicht strengen Modus viel Zeit damit, primitive
string
s inString
Objekt-Wrapper und zurück zu verpacken und zu entpacken . Die Strict-Mode-Version hingegen arbeitet direkt mit dem Grundelementstring
, wodurch die Leistung verbessert wird.quelle
with
hilft auch ein bisschen für jede variable Suche iirc.with
hilft immens, da der Browser feststellen kann, welcher Variablenausdruck sich auf welche Variable bezieht.this
"strenger" ist als Immer-Objektthis
.this
befindetnull
oder befindetundefined
.this
" vs. "Wrapperthis
", wenn Sie . Objekt-Wrapper sind ein Kludge, der niemals hätte existieren dürfen. Daher ist es sinnvoll, dass der strikte Modus sie nach Möglichkeit stärker vermeidet.