我刚刚运行了一个非常简单的JavaScript performance test(不要问为什么)。测试声明了一个变量,但没有为其赋值:
var x;
然后比较将值变量与null
和undefined
进行比较的速度,换句话说:
var y = (x == null);
和var y = (x == undefined);
。
我期待与undefined
的比较是禁食的。事实上,它远远不够。与null
的比较是最快的,大约快80%。
我上面描述的结果来自于在Chrome中运行测试(版本13)。在Firefox中运行它们会产生更接近我预期的结果(与undefined
的比较比使用null
更快,尽管非常小。)
所以,我的问题是这可能是什么原因?为什么Chrome似乎更倾向于与null
进行比较?
快速参考,以下是结果截图:
答案 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)
答案 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));