Executando este snippet no console do Chrome:
function foo() {
return typeof null === 'undefined';
}
for(var i = 0; i < 1000; i++) console.log(foo());
deve imprimir 1000 vezes false
, mas em algumas máquinas imprimirá false
por várias iterações e depois true
para o resto.
Por que isso está acontecendo? É apenas um bug?
javascript
v8
Agos
fonte
fonte
false
. como está, o número detrue
s flutua no cromo.Respostas:
Há um bug do cromo aberto para isso:
Problema 604033 - Compilador JIT não preserva o comportamento do método
Então, sim, é apenas um bug!
fonte
Na verdade, é um bug do motor V8 JavaScript ( Wiki ).
Este mecanismo é usado no Chromium, Maxthron, sistema operacional Android, Node.js etc.
Uma descrição de bug relativamente simples que você pode encontrar neste tópico do Reddit :
Este bug parece ter sido corrigido no próprio V8 ( commit ), bem como no Chromium ( relatório de bug ) e NodeJS ( commit ).
fonte
Para responder à pergunta direta de por que ele muda, o bug está na rotina de otimização "JIT" do mecanismo V8 JS usado pelo Chrome. No início, o código é executado exatamente como escrito, mas quanto mais você o executa, mais potencial existe para que os benefícios da otimização superem os custos da análise.
Nesse caso, após a execução repetida no loop, o compilador JIT analisa a função e a substitui por uma versão otimizada. Infelizmente, a análise faz uma suposição incorreta e a versão otimizada não produz o resultado correto.
Especificamente, o usuário do Reddit RainHappens sugere que é um erro na propagação de tipo :
Este é um dos problemas difíceis com a otimização do código: como garantir que o código que foi reorganizado para desempenho ainda terá o mesmo efeito que o original.
fonte
Isso foi consertado há dois meses e vai pousar no Chrome em breve (já em Canárias).
V8 Edição 1912553002 - Correção de canonização 'typeof null' no virabrequim
Problema 604033 do Chromium - o compilador JIT não preserva o comportamento do método
fonte