JavaScript中与null和undefined比较的速度对比问题

38
我刚刚运行了一个非常简单的JavaScript 性能测试(不要问为什么)。测试声明了一个变量,但没有给它赋值: var x; 然后比较将变量的值与nullundefined进行比较的速度,也就是: var y = (x == null);var y = (x == undefined);.
我原以为与undefined的比较速度会最快,但实际上离谱。与null的比较速度远远超过其他方式,大约快80%。
上述结果来自在Chrome(版本13)中运行测试。在Firefox中运行产生的结果要接近我预期的结果(与null相比,与undefined的比较速度稍微更快一点)。
那么,我的问题是这是什么原因造成的呢?为什么Chrome似乎如此青睐与null的比较?
以下是结果的快速参考截图: enter image description here

1
这是我见过的最快得到10票的问题。 - Layke
@James 如果你使用的是 === 而不是 ==,会怎么样呢? - Surender Thakran
"undefined" 在大多数编程语言中并不存在是有原因的。它是一种方便(或者至少可以这么说),但是它也有代价。 - Domi
4个回答

21

null是一个保留的关键字,不能被重写,所以当你与null进行比较时,只需要进行一次比较即可。

然而,当你检查undefined时,引擎必须进行类型查找和比较,这意味着实际上它会更加苛刻。


如果你需要实际检查某个东西是否未定义,你应该使用

if(typeof notSet == "undefined"){ }

证明

试一试……并在JavaScript控制台中将某些东西设置为 null

null = "will error";
// Errors with --> ReferenceError: invalid assignment left-hand side

然而,如果您尝试使用undefined来执行此操作,它不会报错。这并不意味着您可以覆盖undefined,因为您不能这样做,但是undefined是其自身的原始类型。

null和undefined之间唯一真正的相似之处在于它们都可以强制转换为boolean false。


这很有道理,但为什么Firefox没有像Chrome一样显示类似的结果呢? - James Allardice
我无法回答这个问题,詹姆斯。我完全不知道。可能是它们各自的JS引擎内部差异导致的。就像Chrome在一些重型JavaScript网站上更快,但在其他一些部分则较慢一样。 - Layke
1
@Layke 如果他使用 === 而不是 == 会怎样呢? - Surender Thakran
如果函数参数被命名为 undefined,则可以在函数作用域内覆盖 undefined。例如:function foo(undefined) { console.log(undefined); } - mwcz

1

1
你正在对一个名为undefined的变量进行比较(它返回一个未定义的值),所以它并没有做你原来想要做的事情。
有一些方法可以检查一个变量是否未定义。正如其他帖子中提到的,typeof x === 'undefined'是其中之一。(可能还有另一个可能性,类似于在全局对象上执行hasOwnProperty('x'),但这不会检查作用域链。)

1
我最近发现了这个:

,它与编程有关,保留了HTML格式,不做解释。
 if (typeof this._minLat === 'undefined') {
   this._minLat = Math.min(...this.points.map(point => point.lat));
 }
 return this._minLat;

似乎比这个快很多:

 return  this._minLat || Math.min(...this.points.map(point => point.lat));    

你能解释一下为什么吗? - BrokenBinary
1
我运行了一个jsperf测试(https://jsperf.com/undefined-comparision/1),在Chrome 64上进行了测试,发现与您的答案相反。 - Amit Kumar Gupta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接