Чтобы ответить на прямой вопрос, почему он меняется, ошибка заключается в программе оптимизации "JIT" движка V8 JS, используемого Chrome. Сначала код выполняется точно так, как написано, но чем больше вы его запускаете, тем больше возможностей для преимуществ оптимизации, которые перевешивают затраты на анализ.
В этом случае после повторного выполнения в цикле JIT-компилятор анализирует функцию и заменяет ее оптимизированной версией. К сожалению, анализ делает неверное предположение, и оптимизированная версия на самом деле не дает правильного результата.
В частности, пользователь Reddit RainHappens предполагает, что это ошибка при распространении типа :
Он также выполняет некоторое распространение типов (например, какие типы могут быть у переменных и т. Д.). Есть специальный «необнаруживаемый» тип, когда переменная не определена или имеет значение NULL. В этом случае оптимизатор считает, что значение null не обнаруживается, поэтому его можно заменить строкой «undefined» для сравнения.
Это одна из сложных проблем оптимизации кода: как гарантировать, что код, который был изменен для повышения производительности, по-прежнему будет иметь тот же эффект, что и исходный.