Reference: JavaScript - The Definitive Guide Chapter 6, Chapter 7
for/in loop: (section 6.9)
with 指令會暫時改變 scope chain,雖然程式碼比較好寫,但執行效率會變差,盡量不要用。(section 6.18)
當 object 用 obj["prop"] 來存取時,"prop"可以做 string 的操作,例如 obj["prop"+i] 動態決定要存取什麼屬性。如果用 obj.prop 的寫法,則 prop 當然是寫死的文字。這就是兩種 object 存取方式的差別。(section 7.3)
所有自訂的 object 屬性都是 enumerable 的 (ie. 可使用 for/in loop 存取);Nonenumerable 屬性指的是繼承 Object class 來的那些屬性。所以 propertyIsEnumerable()(某自訂屬性是否 enumerable) 得到的結果幾乎會跟 hasOwnProperty() (是否有某個自訂屬性)一樣。(section 7.4)
(... 閱讀「[JavaScript] Chapter 6&7 Notes」全文)
- 可以動態改變指定的 variable,例如下面這段程式碼複製 obj 的所有屬性名稱到 arr 中。
var obj = {x:1, y:2, z:3}; var arr = new Array( ); var i = 0; for(arr[i++] in obj) /* empty loop body */;
- for/in 存取 property 並沒有依照某個順序,完全是 implementation-dependent,所以在 loop 中新增/刪除某個 property 要好好考慮。