您好,登錄后才能下訂單哦!
幾天前一個小伙伴問我 Object.getOwnPropertyNames()
是干什么用的
平時還真沒有使用到這個方法,一時不知如何回答
從方法名稱來分析,應該是返回的是對象自身屬性名組成的數組
那和 Object.keys()
方法不就一樣了嗎
感覺事情并不這么簡單,于是我仔細看了一下這幾種遍歷對象的方法的區別
for in 循環是最基礎的遍歷對象的方式,它還會得到對象原型鏈上的屬性
// 創建一個對象并指定其原型,bar 為原型上的屬性 const obj = Object.create({ bar: 'bar' }) // foo 為對象自身的屬性 obj.foo = 'foo' for (let key in obj) { console.log(obj[key]) // foo, bar }
可以看到對象原型上的屬性也被循環出來了
在這種情況下可以使用對象的 hasOwnProperty()
方法過濾掉原型鏈上的屬性
for (let key in obj) { if (obj.hasOwnProperty(key)) { console.log(obj[key]) // foo } }
這時候原型上的 bar 屬性就被過濾掉了
Object.keys()
是 ES5 新增的一個對象方法,該方法返回對象自身屬性名組成的數組,它會自動過濾掉原型鏈上的屬性,然后可以通過數組的 forEach()
方法來遍歷
Object.keys(obj).forEach((key) => { console.log(obj[key]) // foo })
另外還有 Object.values()
方法和 Object.entries()
方法,這兩方法的作用范圍和 Object.keys()
方法類似,因此不再說明
for in 循環和 Object.keys()
方法都不會返回對象的不可枚舉屬性
如果需要遍歷不可枚舉的屬性,就要用到前面提到的 Object.getOwnPropertyNames()
方法了
Object.getOwnPropertyNames()
也是 ES5 新增的一個對象方法,該方法返回對象自身屬性名組成的數組,包括不可枚舉的屬性,也可以通過數組的 forEach
方法來遍歷
// 創建一個對象并指定其原型,bar 為原型上的屬性 // baz 為對象自身的屬性并且不可枚舉 const obj = Object.create({ bar: 'bar' }, { baz: { value: 'baz', enumerable: false } }) obj.foo = 'foo' // 不包括不可枚舉的 baz 屬性 Object.keys(obj).forEach((key) => { console.log(obj[key]) // foo }) // 包括不可枚舉的 baz 屬性 Object.getOwnPropertyNames(obj).forEach((key) => { console.log(obj[key]) // baz, foo })
ES2015 新增了 Symbol 數據類型,該類型可以作為對象的鍵,針對該類型 ES2015 同樣新增了 Object.getOwnPropertySymbols()
方法
Object.getOwnPropertySymbols()
方法返回對象自身的 Symbol 屬性組成的數組,不包括字符串屬性
Object.getOwnPropertySymbols(obj).forEach((key) => { console.log(obj[key]) })
什么都沒有,因為該對象還沒有 Symbol 屬性
// 給對象添加一個不可枚舉的 Symbol 屬性 Object.defineProperties(obj, { [Symbol('baz')]: { value: 'Symbol baz', enumerable: false } }) // 給對象添加一個可枚舉的 Symbol 屬性 obj[Symbol('foo')] = 'Symbol foo' Object.getOwnPropertySymbols(obj).forEach((key) => { console.log(obj[key]) // Symbol baz, Symbol foo })
Reflect.ownKeys()
方法是 ES2015 新增的靜態方法,該方法返回對象自身所有屬性名組成的數組,包括不可枚舉的屬性和 Symbol 屬性
Reflect.ownKeys(obj).forEach((key) => { console.log(obj[key]) // baz, foo, Symbol baz, Symbol foo })
方式 | 基本屬性 | 原型鏈 | 不可枚舉 | Symbol |
---|---|---|---|---|
for in | 是 | 是 | 否 | 否 |
Object.keys() | 是 | 否 | 否 | 否 |
Object.getOwnPropertyNames() | 是 | 否 | 是 | 否 |
Object.getOwnPropertySymbols() | 否 | 否 | 是 | 是 |
Reflect.ownKeys() | 是 | 否 | 是 | 是 |
這其中只有 for in 循環會得到對象原型鏈上的屬性,其它方法都只適用于對象自身的屬性
ES 語言后續添加的新特性不會對以前的代碼產生副作用,比如在 ES2015 之前就存在的 for in 循環,Object.keys() 和 Object.getOwnPropertyNames() 是肯定不會返回 Symbol 屬性的。
以上就是JS遍歷對象有幾種方法的詳細內容,更多請關注億速云其它相關文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。