Почему значение typeof null изменяется внутри цикла?

Выполнение этого фрагмента в консоли Chrome:

function foo() {
    return typeof null === 'undefined';
}
for(var i = 0; i < 1000; i++) console.log(foo());

должен печатать 1000 разfalse, но на некоторых машинах будет печататьfalse для ряда итераций, тоtrue что касается прочего.

Почему это происходит? Это просто ошибка?

 Nobita21 июн. 2016 г., 10:45
@ HoàngLong убедитесь, что вы используете его в Chrome
 WangYudong21 июн. 2016 г., 10:45
Firefox и Safari напечатают 1000false.
 yogi21 июн. 2016 г., 10:46
кажется, что Chrome единственное
 Matti Virkkunen21 июн. 2016 г., 16:30
Разве это не просто повторение ошибки, которая циркулирует в Интернете уже целый день? Если вы не обнаружили это, по крайней мере, ссылка на то, где вы узнали об этом ...
 Frédéric Hamidi21 июн. 2016 г., 10:51
Очень интересно. Функция, похоже, подразумевается каким-то образом, выдаваяfor (var i = 0; i < 1000; i++) console.log(typeof null === "undefined"); результаты в 1000 разfalse.
 Hoàng Long21 июн. 2016 г., 10:43
Это возвращается 1000 раз, правда для меня ...
 Agos21 июн. 2016 г., 10:44
@ HoàngLong, как я уже сказал в вопросе, это происходит только на некоторых машинах. Также возможно, что это происходит только на некоторых версиях Chrome.
 le_m21 июн. 2016 г., 11:02
Как насчетvar results = []; for(var i = 0; i < 1000; i++) results.push(foo()); console.log(results);?
 dandavis21 июн. 2016 г., 10:44
что-то странное с консолью Chrome: если вы нажмете на массив и войдете в него, всеfalse, как есть, числоtrueS колеблется в хром.
 yogi21 июн. 2016 г., 10:56
Это начинает происходить вi < 264 у меня в Chrome естьVersion 51.0.2704.103 m
 Zoran Pandovski21 июн. 2016 г., 11:00
Я повторяю до 100 и получаю 100 ложных в хром
 Jax Teller21 июн. 2016 г., 10:44
я думаю, что это ошибка, у меня 262 ложных / 738 истинных
 jpmc2622 июн. 2016 г., 04:59
@Nobita Радует, что я использую Firefox. знак равно
 Agos21 июн. 2016 г., 16:31
@ MattiVirkkunen да, я понимаю, что в последнее время это происходит. Поскольку я получил этот скриншот в приватном чате, я не могу ссылаться на свой источник.
 Remo Lüönd21 июн. 2016 г., 11:07
Похоже, это происходит только при использованииconsole.log чтобы распечатать результат в консоли, см.jsfiddle.net/q6s4w5g9.

Ответы на вопрос(4)

Решение Вопроса
 Slumber8622 июн. 2016 г., 11:11
«Просто» только сказать, что это не особенность или что-то странное. Это критическая ошибка, но просто ошибка!
 jpmc2622 июн. 2016 г., 05:01
"Просто"? Разве это не может сломать произвольные веб-приложения во всем мире?

V8 Движок JavaScript (Wikiбаг.

Этот движок используется в Chromium, Maxthron, ОС Android, Node.js и т. Д.

Относительно простоописание ошибки вы можете найти в этомReddit тема:

Современные механизмы JavaScript компилируют JS-код в оптимизированный машинный код при его выполнении (компиляция Just In Time), чтобы он работал быстрее. Тем не менее, шаг оптимизации имеет некоторые начальные затраты производительности в обмен на долгосрочное ускорение, поэтому механизм динамически решает, стоит ли метод того или иного метода, в зависимости от того, как часто он используется.

В этом случае, похоже, ошибка только в оптимизированном пути, в то время как неоптимизированный путь работает нормально. Таким образом, сначала метод работает как задумано, но если он вызывается в цикле достаточно часто, в какой-то момент движок решит оптимизировать его и заменит его ошибочной версией.

Эта ошибка, кажется, была исправлена ​​в самом V8 (совершить), также как и в Chromium (сообщение об ошибке) и NodeJS (совершить).

 Sergey Novikov21 июн. 2016 г., 19:51
Это было исправлено в движке V8 сегодня (21.06), я полагаю, скоро соответствующее программное обеспечение будет обновлено.
 Michael Shopsin21 июн. 2016 г., 19:58
Бэкпортирование исправления v8 в Node.js 6.2.x уже выполняется как проблема# 7348 принадлежитTheAlphaNerd.
 Michael Shopsin21 июн. 2016 г., 19:32
Я подтвердил, что ошибка все еще присутствует в Node.js 6.2.2, что меня беспокоит.

почему он меняется, ошибка заключается в подпрограмме оптимизации JIT движка V8 JS, используемого Chrome. Сначала код выполняется точно так, как написано, но чем больше вы его запускаете, тем больше возможностей для оптимизации перевесить затраты на анализ.

В этом случае после повторного выполнения в цикле JIT-компилятор анализирует функцию и заменяет ее оптимизированной версией. К сожалению, анализ делает неверное предположение, и оптимизированная версия на самом деле не дает правильного результата.

В частности,Пользователь Reddit RainHappens предлагает что это ошибка втип распространения:

Он также выполняет распространение некоторых типов (например, в каких типах может быть переменная и т. Д.). Существует специальный «необнаружимый» тип для случая, когда переменная не определена или равна нулю. В этом случае оптимизатор говорит: «ноль не обнаруживается», поэтому его можно заменить строкой «неопределенная» для сравнения.

Это одна из трудных проблем с оптимизацией кода: как гарантировать, что код, перестроенный для повышения производительности, будет иметь тот же эффект, что и оригинал.

Ваш ответ на вопрос