Pour répondre à la question de pourquoi elle change, le bug est dans le "JIT" optimisation de la routine de la V8 JS moteur utilisé par Chrome. Au premier abord, le code est exécuté exactement comme c'est écrit, mais le plus vous courez, plus le potentiel existe pour les avantages de l'optimisation de l'emporter sur les coûts d'analyse.
Dans ce cas, après l'exécution répétée dans la boucle, le compilateur JIT analyses de la fonction, et la remplace par une version optimisée. Malheureusement, l'analyse fait une hypothèse erronée, et la version optimisée n'est pas réellement obtenir le résultat correct.
Plus précisément, Reddit utilisateur RainHappens suggère que c'est une erreur dans la propagation de type:
Il a également fait un peu de type de propagation (comme dans quels types une variable, etc peut être). Il y a un spécial "indétectable" type pour quand une variable n'est pas définie ou null. Dans ce cas, l'optimiseur de passe "null est indétectable, de sorte qu'il peut être remplacé par le "undefined" chaîne de caractères pour la comparaison.
C'est l'un des problèmes difficiles avec l'optimisation de code: comment garantir que le code qui a été réorganisés pour des performances toujours le même effet que l'original.