关于优化for-in语句

about optimizing for-in statement

本文关键字:for-in 语句 优化 于优化      更新时间:2023-09-26

我读了一篇叫做优化杀手的文章,在5.2.3中。对象包含可枚举数组下标,它表示:

解决方法:总是使用Object。键,并使用for循环遍历数组。如果你真的需要整个原型链中的所有属性,创建一个独立的辅助函数:

function inheritedKeys(obj) {
    var ret = [];
    for(var key in obj) {
        ret.push(key);
    }
    return ret;
}
我不明白这是什么意思。在上面的代码中,仍然有一个for...in,所以函数inheritedKeys不能被优化,它怎么可能是一个孤立的辅助函数呢?

这只是一个关于如何使用for in循环从对象获取键的例子。他实际上告诉你,为了让它更快,你应该使用Object。键,当你想获取一个对象的键时。

这是测试性能。http://jsperf.com/forintest

所以不要用这个来检索对象键

function inheritedKeys(obj) {
    var ret = [];
    for(var key in obj) {
        ret.push(key);
    }
    return ret;
}
var myobject= {"1":"a","2":"b"};
var calculation = inheritedKeys(myobject);

用这个代替,它更干净,更容易阅读,更快

var myobject= {"1":"a","2":"b"};
var calculation = Object.keys(myobject);


下面是一个比较for在使用with array和普通for循环中的测试。

http://jsperf.com/forinarray

你可以看到for循环要快得多。

不要用这个

function iteratesOverArray() {
    var arr = [1, 2, 3];
    var newArr = [];
    for (var index in arr) {
       newArr.push(index);
    }
    return newArr;
}
var arr = iteratesOverArray();

用这个代替

function iteratesOverArray() {
    var arr = [1, 2, 3];
    var newArr = [];
    for (var i=0,l=arr.length-1;i<=l;i++) {
       newArr.push(i);
    }
    return newArr;
}
var arr = iteratesOverArray();