quitar como javascript v8

javascript - como - ¿Por qué el valor de typeof null cambia dentro de un bucle?



typeof javascript (4)

Ejecutando este fragmento en la consola de Chrome:

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

debería imprimir 1000 veces false , pero en algunas máquinas imprimirá false para varias iteraciones, luego true para el resto.

¿Por qué está pasando esto? ¿Es solo un error?


En realidad es un error del motor V8 JavaScript ( Wiki ).

Este motor se utiliza en Chromium, Maxthron, Android OS, Node.js, etc.

Descripción de error relativamente simple que puede encontrar en este tema de Reddit :

Los motores JavaScript modernos compilan el código JS en código de máquina optimizado cuando se ejecuta (compilación Just In Time) para que funcione más rápido. Sin embargo, el paso de optimización tiene un costo de rendimiento inicial a cambio de una aceleración a largo plazo, por lo que el motor decide dinámicamente si un método vale la pena dependiendo de qué tan comúnmente se use.

En este caso, parece haber un error solo en la ruta optimizada, mientras que la ruta no optimizada funciona bien. Entonces, al principio, el método funciona según lo previsto, pero si se llama en un bucle con la frecuencia suficiente en algún momento, el motor decidirá optimizarlo y lo reemplazará con la versión con errores.

Este error parece haberse solucionado en V8 ( commit ), así como en Chromium ( informe de error ) y NodeJS ( commit ).




Para responder a la pregunta directa de por qué cambia, el error se encuentra en la rutina de optimización "JIT" del motor V8 JS utilizado por Chrome. Al principio, el código se ejecuta exactamente como está escrito, pero cuanto más lo ejecute, más posibilidades hay de que los beneficios de la optimización superen los costos del análisis.

En este caso, después de una ejecución repetida en el bucle, el compilador JIT analiza la función y la reemplaza por una versión optimizada. Desafortunadamente, el análisis hace una suposición incorrecta, y la versión optimizada en realidad no produce el resultado correcto.

Específicamente, el usuario de Reddit RainHappens sugiere que es un error en la propagación de tipos :

También hace algún tipo de propagación (como en qué tipos puede ser una variable, etc.). Hay un tipo especial "indetectable" para cuando una variable es indefinida o nula. En este caso, el optimizador se vuelve "nulo es indetectable, por lo que se puede reemplazar con la cadena" indefinida "para la comparación.

Este es uno de los problemas difíciles con la optimización del código: cómo garantizar que el código que se ha reorganizado para el rendimiento seguirá teniendo el mismo efecto que el original.