函数调用为循环ES6的可迭代

时间:2017-09-18 08:17:14

标签: javascript object ecmascript-6

寻找最佳实践建议。

中的函数调用为作为可迭代对象是一个好习惯吗?

const obj = {key1:'a', key2:'b'};

for(const i of Object.keys(obj)){ ... }

或者更好

const obj = {key1:'a', key2:'b'};
const allKeys = Object.keys(obj);
for(const i of allKeys){ ... }

在循环的每次迭代中是否调用了Object.keys函数?

3 个答案:

答案 0 :(得分:4)

你可以通过嘲笑类似的案例来检查它



function A(){
    console.log('function called');
    return [1, 2, 3, 4, 5];
}

for(let i of A()){
    console.log(i);
}




如你所见,A()只被调用一次

答案 1 :(得分:1)

您的第一个示例与第二个示例完全相同,只是没有allKeys常量。在你的第一个例子中:

const obj = {key1:'a', key2:'b'};

for(const i of Object.keys(obj)){ ... 

... Object.keys只会被调用一次,然后它的迭代器将被检索并用于循环。 (这在规范中的ForIn/OfHeadEvaluation中有所涉及,但它很重要。)所以你使用那个表格很好,但效率不高。

答案 2 :(得分:0)

Object.keys的调用仅在两种变体中都进行过一次。

但也可以考虑这个不依赖于for的{​​{1}}循环的可能性:

Object.keys

for (const prop in obj) { } 创建一个数组,而上面的Object.keys循环则没有。后者仅在必要时检索项目。当然,如果你的for循环永远不会过早退出,它仍会检索所有循环,所以这只会在你计划提前退出循环时产生影响。在这种情况下,相应的迭代器永远不会访问剩余的项目,而for在创建数组时已经这样做了。

要注意的一件事:Object.keys循环还将迭代可枚举的继承的属性,而不仅仅是拥有属性,而for .. in将仅列出自己的可枚举属性。您可以在Object.keys循环中添加额外的测试以排除非自有属性:

for