最近看到一篇文章如下:
JavaScript获取数据的性能有如下顺序(从快到慢):变量获取 > 数组下标获取(对象的整数索引获取) > 对象属性获取(对象非整数索引获取)。我们可以通过最快的方式代替最慢的方式:
var body = document.body;
var maxLength = someArray.length;
//...
需要考虑,作用域链和原型链中的对象索引。如果作用域链和原型链较长,也需要对所需要的变量继续缓存,否则沿着作用域链和原型链向上查找时也会额外消耗时间。
测试代码如下:
var arr = [];
var obj = {};
for (let i = 0; i < 100000; i ++) {
arr[+i] = + i;
obj['a' + i] = + i;
}
console.time('arr');
console.log(arr[10000]);
console.timeEnd('arr');
console.time('obj');
console.log(obj['a10000']);
console.timeEnd('obj');
chrome环境
// 测试结果1
10000
arr: 0.484ms
10000
obj: 0.248ms
// 测试结果2
10000
arr: 0.242ms
10000
obj: 0.105ms
// 测试结果3
10000
arr: 0.272ms
10000
obj: 0.168ms
```bash
node环境 v7.6
```bash
// 测试结果1
10000
arr: 2.123ms
10000
obj: 0.098ms
// 测试结果2
10000
arr: 2.024ms
10000
obj: 0.096ms
// 测试结果3
10000
arr: 1.939ms
10000
obj: 0.097ms
```bash
不管在node环境还是chrome环境下,都是对象属性获取较快,是我的测试方式有问题么?