寻找最佳实践建议。
将中的函数调用为作为可迭代对象是一个好习惯吗?
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函数?
答案 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