Ausführen dieses Snippets in der Chrome-Konsole:
function foo() {
return typeof null === 'undefined';
}
for(var i = 0; i < 1000; i++) console.log(foo());
sollte 1000 Mal gedruckt werden false
, aber auf einigen Computern wird false
für eine Reihe von Iterationen gedruckt , dann true
für den Rest.
Warum passiert dies? Ist es nur ein Fehler?
javascript
v8
Agos
quelle
quelle
false
. wie es ist,true
schwankt die Anzahl von s in Chrom.Antworten:
Hierfür ist ein Chromfehler offen:
Problem 604033 - Der JIT-Compiler behält das Methodenverhalten nicht bei
Also ja, es ist nur ein Fehler!
quelle
Es ist eigentlich ein Fehler in der V8 JavaScript Engine ( Wiki ).
Diese Engine wird in Chromium, Maxthron, Android OS, Node.js usw. verwendet.
Relativ einfache Fehlerbeschreibung finden Sie in diesem Reddit-Thema :
Dieser Fehler scheint in V8 selbst (haben fest verpflichten ), aswell wie in Chrom ( Bug - Report ) und NodeJS ( commit ).
quelle
Um die direkte Frage zu beantworten, warum es sich ändert, befindet sich der Fehler in der Optimierungsroutine "JIT" der von Chrome verwendeten V8 JS-Engine. Zunächst wird der Code genau so ausgeführt, wie er geschrieben wurde. Je mehr Sie ihn ausführen, desto größer ist jedoch das Potenzial, dass die Vorteile der Optimierung die Kosten für die Analyse überwiegen.
In diesem Fall analysiert der JIT-Compiler nach wiederholter Ausführung in der Schleife die Funktion und ersetzt sie durch eine optimierte Version. Leider geht die Analyse von einer falschen Annahme aus und die optimierte Version liefert nicht das richtige Ergebnis.
Insbesondere schlägt Reddit Benutzer RainHappens , dass es ein Fehler in Art Ausbreitungs :
Dies ist eines der größten Probleme bei der Optimierung des Codes: Wie kann sichergestellt werden, dass der Code, der für die Leistung neu angeordnet wurde, immer noch den gleichen Effekt wie das Original hat?
quelle
Dies wurde vor zwei Monaten behoben und wird bald in Chrome landen (bereits auf Canary).
V8-Ausgabe 1912553002 - Die Kanonisierung des Typs Null in der Kurbelwelle wurde korrigiert
Chromium Issue 604033 - JIT-Compiler behält das Methodenverhalten nicht bei
quelle