Щоб відповісти на пряме запитання, чому вона змінюється, помилка знаходиться в рутині оптимізації "JIT" двигуна V8 JS, який використовується Chrome. Спочатку код виконується точно так само, як написано, але чим більше ви його запускаєте, тим більше можливостей для переваг оптимізації перевершити витрати на аналіз.
У цьому випадку після повторного виконання в циклі компілятор JIT аналізує функцію та замінює її оптимізованою версією. На жаль, аналіз робить неправильне припущення, а оптимізована версія насправді не дає правильного результату.
Зокрема, користувач Reddit RainHappens припускає, що це помилка в поширенні типу :
Він також здійснює деякий тип розповсюдження (як у тих, які типи можуть бути змінними тощо). Існує особливий тип "невизначення", коли змінна не визначена або нульова. У цьому випадку оптимізатор переходить "null" не виявляється, тому його можна замінити рядком "undefined" для порівняння.
Це одна з важких проблем оптимізації коду: як гарантувати, що перероблений для продуктивності код все одно матиме такий же ефект, як і оригінал.