Exécution de cet extrait dans la console Chrome:
function foo() {
return typeof null === 'undefined';
}
for(var i = 0; i < 1000; i++) console.log(foo());
devrait imprimer 1000 fois false
, mais sur certaines machines imprimera false
pour un certain nombre d'itérations, puis true
pour le reste.
Pourquoi cela arrive-t-il? Est-ce juste un bug?
javascript
v8
Agos
la source
la source
false
. tel quel, le nombre detrue
s fluctue en chrome.Réponses:
Il y a un bug de chrome ouvert pour cela:
Problème 604033 - Le compilateur JIT ne conserve pas le comportement de la méthode
Alors oui, c'est juste un bug!
la source
C'est en fait un bogue du moteur JavaScript V8 ( Wiki ).
Ce moteur est utilisé dans Chromium, Maxthron, Android OS, Node.js etc.
Description de bogue relativement simple que vous pouvez trouver dans cette rubrique Reddit :
Ce bogue semble avoir été corrigé dans V8 lui-même ( commit ), ainsi que dans Chromium ( rapport de bogue ) et NodeJS ( commit ).
la source
Pour répondre à la question directe de savoir pourquoi il change, le bogue se trouve dans la routine d'optimisation "JIT" du moteur V8 JS utilisé par Chrome. Au début, le code est exécuté exactement comme il est écrit, mais plus vous l'exécutez, plus il y a de chances que les avantages de l'optimisation l'emportent sur les coûts d'analyse.
Dans ce cas, après une exécution répétée dans la boucle, le compilateur JIT analyse la fonction et la remplace par une version optimisée. Malheureusement, l'analyse fait une hypothèse incorrecte et la version optimisée ne produit pas réellement le résultat correct.
Plus précisément, l' utilisateur de Reddit RainHappens suggère qu'il s'agit d'une erreur de propagation de type :
C'est l'un des problèmes difficiles avec l'optimisation du code: comment garantir que le code qui a été réorganisé pour les performances aura toujours le même effet que l'original.
la source
Ce problème a été résolu il y a deux mois et va bientôt atterrir dans Chrome (déjà aux Canaries).
V8 Issue 1912553002 - Correction de la canonisation 'typeof null' dans le vilebrequin
Chromium Issue 604033 - Le compilateur JIT ne préserve pas le comportement de la méthode
la source