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