用for循環遍歷對象
首先有Object.keys()的方法,拿到可迭代(遍歷)的私有屬性名的集合(數組)
但如果直接用 for...in 遍歷可能會出現缺陷:
for in 典型的缺陷:
var arr = [1, 2, 3, 4];
正常情況:
正常情況下我們輸出的是沒問題的;但是
如果你給 Array添加了一個(判斷元素是不是存在數組中)的新方法:
然后我們再試試 for...in ,看一看它還好不好使。
為什么會多了一個inArray呢?因為它也被遍歷出來了。
for...in...會遍歷到對象中所有可枚舉的屬性方法,我們給對象添加的方法默認也是可枚舉的;
自己添加的方法怎么樣才能不被遍歷到呢?
于是我們就用到了 Object.defineProperty ()
這個方法。
該方法允許精確地添加或修改對象的屬性。通過賦值操作修改,在枚舉對象屬性時會被枚舉到(for...in 或 Object.keys方法),可以改變這些屬性的值,也可以刪除這些屬性。這個方法允許修改默認的額外選項(或配置)。默認情況下,使用 Object.defineProperty() 添加的屬性值是不可修改(immutable)的。 (摘自:MDN web docs)
此方法有四個屬性:
configurable
當且僅當該屬性的 configurable 鍵值為 true 時,該屬性的描述符才能夠被改變,同時該屬性也能從對應的對象上被刪除。 默認為 false。
enumerable
當且僅當該屬性的 enumerable 鍵值為 true 時,該屬性才會出現在對象的枚舉屬性中。 默認為 false。
數據描述符還具有以下可選鍵值:
value
該屬性對應的值。可以是任何有效的 JavaScript 值(數值,對象,函數等)。 默認為 undefined。
writable
當且僅當該屬性的 writable 鍵值為 true 時,屬性的值,也就是上面的 value,才能被賦值運算符改變。 默認為 false。
(摘自:MDN web docs)
看了這四個屬性,我們就能很開心的解決上面的問題了:
到此為止for-in與不可枚舉的問題就解決了,希望能幫助到大家!更多關于前端培訓的問題,歡迎咨詢千鋒教育在線名師,如果想要了解我們的師資、課程、項目實操的話可以點擊咨詢課程顧問,獲取試聽資格來試聽我們的課程,在線零距離接觸千鋒教育大咖名師,讓你輕松從入門到精通。