Выполнение этого фрагмента в консоли Chrome:
function foo() {
return typeof null === 'undefined';
}
for(var i = 0; i < 1000; i++) console.log(foo());
должен печатать 1000 раз false
, но на некоторых машинах будет печатать false
несколько итераций, а затем true
- все остальные.
Почему это происходит? Это просто ошибка?
javascript
v8
Акос
источник
источник
false
. как есть, количествоtrue
s колеблется в зависимости от хрома.Ответы:
Для этого есть ошибка хрома:
Проблема 604033 - JIT-компилятор не сохраняет поведение метода.
Так что да, это просто ошибка!
источник
На самом деле это ошибка движка V8 JavaScript ( Wiki ).
Этот движок используется в Chromium, Maxthron, Android OS, Node.js и т. Д.
Относительно простое описание ошибки вы можете найти в этой теме Reddit :
Эта ошибка, похоже, была исправлена в самой версии V8 ( фиксация ), а также в Chromium ( отчет об ошибке ) и NodeJS ( фиксация ).
источник
Чтобы ответить на прямой вопрос, почему он меняется, ошибка заключается в программе оптимизации "JIT" движка V8 JS, используемого Chrome. Сначала код выполняется точно так, как написано, но чем больше вы его запускаете, тем больше возможностей для преимуществ оптимизации, которые перевешивают затраты на анализ.
В этом случае после повторного выполнения в цикле JIT-компилятор анализирует функцию и заменяет ее оптимизированной версией. К сожалению, анализ делает неверное предположение, и оптимизированная версия на самом деле не дает правильного результата.
В частности, пользователь Reddit RainHappens предполагает, что это ошибка при распространении типа :
Это одна из сложных проблем оптимизации кода: как гарантировать, что код, который был изменен для повышения производительности, по-прежнему будет иметь тот же эффект, что и исходный.
источник
Это было исправлено два месяца назад и скоро появится в Chrome (уже в Canary).
V8 Issue 1912553002 - Исправлена канонизация нулевого типа в коленчатом валу.
Проблема Chromium 604033 - JIT-компилятор не сохраняет поведение метода
источник