2017-09-18 55 views
-1

尋找最佳實踐建議。函數調用可循環用於循環ES6

將中的函數調用作爲可迭代對象是否是一種很好的做法?

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

他們相當於 – damd

回答

4

您可以嘲諷一個類似的案件

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

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

檢查它,你可以看到一個()被調用一次

+0

*您可*,肯定的,但最好是有什麼實際發生的理解。 –

+0

檢查行爲的好方法! – Roman

1

您的第一個示例與第二個示例的功能相同,只是沒有allKeys常量。在你的第一個例子:

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

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

... Object.keys只會被調用一次,然後它的迭代器將被檢索並用於循環。 (這在規範中包含在ForIn/OfHeadEvaluation中,但它很重要)。所以你使用這種形式很好,但效率並不高。

0

Object.keys呼叫只在做一次兩種變體。

還要考慮爲這個可能性循環for不依賴於Object.keys

for (const prop in obj) { } 

Object.keys創建一個數組,而上述for循環不。後者只根據需要檢索項目。當然,如果您的for循環永遠不會提前退出,它仍然會檢索所有這些循環,所以這隻會在您計劃提前退出循環時發揮作用。在這種情況下,相應的迭代器永遠不會訪問剩餘的項目,而Object.keys已經在創建數組時完成了。

有一點要注意:一for .. in循環也將遍歷枚舉繼承性能,不僅自己屬性,同時Object.keys只列出自己枚舉的屬性。您可以在for循環添加一個額外的測試,以排除非自己的屬性:

if (obj.hasOwnProperty(prop)) 
+0

當然應該是'in',而不是'''。感謝提及,@ T.J.Crowder。 – trincot

+0

啊......當然。出於某種原因,我沒有對此作過分析。我建議調用re-inherited屬性的區別。 –

+0

我很好奇你的斷言,「上面的for'循環沒有[創建數組],並且」只根據需要檢索項目「。當然,它不會創建一個實際的數組,但我懷疑大多數或所有引擎都會準備一個所有密鑰的內部列表 - 不是嗎? –