幾天前一個(gè)小伙伴問(wèn)我 Object.getOwnPropertyNames() 是干什么用的

在永勝等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶提供成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),營(yíng)銷(xiāo)型網(wǎng)站建設(shè),外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè),永勝網(wǎng)站建設(shè)費(fèi)用合理。
平時(shí)還真沒(méi)有使用到這個(gè)方法,一時(shí)不知如何回答
從方法名稱(chēng)來(lái)分析,應(yīng)該是返回的是對(duì)象自身屬性名組成的數(shù)組
那和 Object.keys() 方法不就一樣了嗎
感覺(jué)事情并不這么簡(jiǎn)單,于是我仔細(xì)看了一下這幾種遍歷對(duì)象的方法的區(qū)別
for in 循環(huán)是最基礎(chǔ)的遍歷對(duì)象的方式,它還會(huì)得到對(duì)象原型鏈上的屬性
// 創(chuàng)建一個(gè)對(duì)象并指定其原型,bar 為原型上的屬性
const obj = Object.create({
  bar: 'bar'
})
// foo 為對(duì)象自身的屬性
obj.foo = 'foo'
for (let key in obj) {
  console.log(obj[key]) // foo, bar
}可以看到對(duì)象原型上的屬性也被循環(huán)出來(lái)了
在這種情況下可以使用對(duì)象的 hasOwnProperty() 方法過(guò)濾掉原型鏈上的屬性
for (let key in obj) {
  if (obj.hasOwnProperty(key)) {
    console.log(obj[key]) // foo
  }
}這時(shí)候原型上的 bar 屬性就被過(guò)濾掉了
Object.keys() 是 ES5 新增的一個(gè)對(duì)象方法,該方法返回對(duì)象自身屬性名組成的數(shù)組,它會(huì)自動(dòng)過(guò)濾掉原型鏈上的屬性,然后可以通過(guò)數(shù)組的 forEach() 方法來(lái)遍歷
Object.keys(obj).forEach((key) => {
  console.log(obj[key]) // foo
})另外還有 Object.values() 方法和 Object.entries() 方法,這兩方法的作用范圍和 Object.keys() 方法類(lèi)似,因此不再說(shuō)明
for in 循環(huán)和 Object.keys() 方法都不會(huì)返回對(duì)象的不可枚舉屬性
如果需要遍歷不可枚舉的屬性,就要用到前面提到的 Object.getOwnPropertyNames() 方法了
Object.getOwnPropertyNames() 也是 ES5 新增的一個(gè)對(duì)象方法,該方法返回對(duì)象自身屬性名組成的數(shù)組,包括不可枚舉的屬性,也可以通過(guò)數(shù)組的 forEach 方法來(lái)遍歷
// 創(chuàng)建一個(gè)對(duì)象并指定其原型,bar 為原型上的屬性
// baz 為對(duì)象自身的屬性并且不可枚舉
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 數(shù)據(jù)類(lèi)型,該類(lèi)型可以作為對(duì)象的鍵,針對(duì)該類(lèi)型 ES2015 同樣新增了 Object.getOwnPropertySymbols() 方法
Object.getOwnPropertySymbols() 方法返回對(duì)象自身的 Symbol 屬性組成的數(shù)組,不包括字符串屬性
Object.getOwnPropertySymbols(obj).forEach((key) => {
  console.log(obj[key])
})什么都沒(méi)有,因?yàn)樵搶?duì)象還沒(méi)有 Symbol 屬性
// 給對(duì)象添加一個(gè)不可枚舉的 Symbol 屬性
Object.defineProperties(obj, {
  [Symbol('baz')]: {
    value: 'Symbol baz',
    enumerable: false
  }
})
// 給對(duì)象添加一個(gè)可枚舉的 Symbol 屬性
obj[Symbol('foo')] = 'Symbol foo'
Object.getOwnPropertySymbols(obj).forEach((key) => {
  console.log(obj[key]) // Symbol baz, Symbol foo
})Reflect.ownKeys() 方法是 ES2015 新增的靜態(tài)方法,該方法返回對(duì)象自身所有屬性名組成的數(shù)組,包括不可枚舉的屬性和 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 循環(huán)會(huì)得到對(duì)象原型鏈上的屬性,其它方法都只適用于對(duì)象自身的屬性
ES 語(yǔ)言后續(xù)添加的新特性不會(huì)對(duì)以前的代碼產(chǎn)生副作用,比如在 ES2015 之前就存在的 for in 循環(huán),Object.keys() 和 Object.getOwnPropertyNames() 是肯定不會(huì)返回 Symbol 屬性的。
以上就是JS遍歷對(duì)象有幾種方法的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注創(chuàng)新互聯(lián)其它相關(guān)文章!
                網(wǎng)頁(yè)題目:JavaScript遍歷對(duì)象的方法有幾種
                
                標(biāo)題路徑:http://www.chinadenli.net/article2/peepic.html
            
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、響應(yīng)式網(wǎng)站、服務(wù)器托管、商城網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站營(yíng)銷(xiāo)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
