为什么获取成员比调用hasOwnProperty更快?
- 论坛
- 为什么获取成员比调用hasOwnProperty更快?
15 浏览
为什么获取成员比调用hasOwnProperty更快?
我正在编写一个JS对象,需要对字符串:函数对进行基本的键值缓存。这个类在客户端运行,并为渲染页面的部分缓存部分编译的模板,所以可能有20-200个项目。
在实际编写这个类之前,我觉得最好先看看最快的缓存检索方法是什么。我想到的选项有:
1. 基本属性访问:
if (x[k] !== undefined) {
v = x[k];
}
2. 键检查(Own):
if (x.hasOwnProperty(k)) {
v = x[k];
}
3. 键检查(General):
if (k in x) {
v = x[k];
}
我假设3会是最快的(检查属性是否存在,但不检索它或担心它存在的位置),而1会是最慢的(即使不做任何操作,也会获取属性)。
将所有这些方法放入jsPerf中得到了一些非常奇怪的结果。在Chrome(和Chromium)和IE中,#1的速度大约是#3的两倍。在Firefox中,#3略微更快,但所有三者之间的性能相似。无论我是否在虚拟机中运行,结果都没有变化,版本之间也没有太大变化。
我很难解释这些结果。可能是#1注意到数据不会发生任何变化,所以只是内部检查键,但为什么它比#3更快呢?为什么#3没有得到相同的优化?
是什么导致了这些结果?我可能碰到了一些JIT优化,导致数据不准确吗?
更重要的是,为什么在不同浏览器之间存在如此大的差异,而在Firefox中所有选项大致相等?