Javascript 为什么typeof null的值在循环中发生变化?

Javascript 为什么typeof null的值在循环中发生变化?,javascript,v8,Javascript,V8,在Chrome控制台中执行此代码段: 函数foo(){ 返回typeof null===“未定义”; } 对于(var i=0;i

在Chrome控制台中执行此代码段:

函数foo(){
返回typeof null===“未定义”;
}

对于(var i=0;i<1000;i++)console.log(foo())有一个chromium bug为此打开:

所以是的,这只是一只虫子

这实际上是一个JavaScript引擎()错误

该引擎用于Chromium、Maxthron、Android操作系统、Node.js等

您可以在以下内容中找到相对简单的内容:

现代JavaScript引擎将JS代码编译成优化的机器代码 当它被执行时(即时编译),使它运行得更快。 然而,优化步骤在某些方面有一些初始性能成本 换来长期加速,因此发动机会动态决定 一种方法是否值得,取决于它的使用频率

在这种情况下,似乎只有在优化的路径中存在bug, 而未优化的路径运行良好。因此,首先,该方法的工作原理如下 预期的,但如果在某个点在循环中调用足够频繁 引擎将决定对其进行优化,并将其替换为四轮马车 版本


这个bug似乎已经在V8本身()以及Chrome()和NodeJS()中修复。

为了回答为什么它会改变的直接问题,这个bug出现在Chrome使用的V8 JS引擎的“JIT”优化例程中。起初,代码完全按照编写的方式运行,但运行得越多,优化的好处就越有可能超过分析的成本

在这种情况下,在循环中重复执行之后,JIT编译器分析函数,并用优化版本替换它。不幸的是,分析做出了错误的假设,优化后的版本实际上并没有产生正确的结果

具体来说,这是类型传播中的错误:

它还进行一些类型传播(比如变量可以是什么类型)。当变量未定义或为空时,有一种特殊的“不可检测”类型。在这种情况下,优化器会显示“null”是不可检测的,因此可以将其替换为“undefined”字符串进行比较


这是优化代码的难题之一:如何保证为性能而重新排列的代码仍然与原来的代码具有相同的效果。

这是两个月前修复的,很快就会在Chrome中出现(已经在Canary中)


对我来说,它返回了1000倍的真值…我认为这是错误,我有262个假/738个真值。chrome的控制台有点奇怪:如果你推到一个数组并记录数组,它都是
false
true
的数量在chrome中波动。@Hoán正如我在问题中所说的,这种情况只发生在一些机器上。它是也可能仅在的某些版本上发生Chrome@Hoa ngLong确保您正在ChromeI中运行它。我确认该漏洞仍然存在于Node.js 6.2.2中,这让我很担心。该漏洞今天(21.06)在V8引擎中修复,我相信相关软件很快就会更新。将V8修复后移到Node.js 6.2.x已在进行中,因为问题属于。”只是“?这不能打破世界范围内任意的web应用程序吗?”只是“只是”说这不是一个功能或奇怪的东西。这是一个关键的错误,但只是一个错误!