在JavaScript中与null和undefined进行比较的速度

时间:2011-09-02 12:44:32

标签: javascript performance

我刚刚运行了一个非常简单的JavaScript performance test(不要问为什么)。测试声明了一个变量,但没有为其赋值:

var x;

然后比较将值变量与nullundefined进行比较的速度,换句话说:

var y = (x == null);var y = (x == undefined);

我期待与undefined的比较是禁食的。事实上,它远远不够。与null的比较是最快的,大约快80%。

我上面描述的结果来自于在Chrome中运行测试(版本13)。在Firefox中运行它们会产生更接近我预期的结果(与undefined的比较比使用null更快,尽管非常小。)

所以,我的问题是这可能是什么原因?为什么Chrome似乎更倾向于与null进行比较?

快速参考,以下是结果截图:

enter image description here

4 个答案:

答案 0 :(得分:16)

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之间唯一真正的相似之处在于它们都可以被强制转换为布尔值false。

答案 1 :(得分:1)

如果我认为好,他们就不一样了。所以你不能使用null而不是undefined。

typeof !== "undefined" vs. != null

答案 2 :(得分:1)

您正在与名为undefined的变量(它返回一个未定义的值)的查找进行比较,因此它没有按照您的意图进行。

有多种方法可以检查变量是否未定义。正如其他海报所提到的那样,typeof x === 'undefined'就是其中之一。 (可能还有另一种可能性就是hasOwnProperty('x')在全局对象上执行,但是没有检查范围链。)

答案 3 :(得分:1)

我最近发现了这个:

 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));