如何解决for in 循环无法遍历symbol key的问题
歡迎關(guān)注博主博客: https://lvsige.top/
先說for in循環(huán)對(duì)象,hasOwnProperty()的作用
var obj = {name:"echolun",age:"24",sex:"male" }, objName=[], //用來裝對(duì)象屬性名 objVal=[]; //用來裝對(duì)象屬性值 for(var i in obj){objName.push(i);objVal.push(obj[i]); } console.log(objName,objVal);
需要注意的是,for in循環(huán)對(duì)象會(huì)訪問原型鏈上所有對(duì)象屬性,看下面。
這里同樣是循環(huán)對(duì)象obj,但是需要注意的是,原型鏈上我們額外添加的對(duì)象game也被循環(huán)出來。
那么我們只想循環(huán)對(duì)應(yīng)的對(duì)象該怎么做呢,這里引入hasOwnProperty()方法,hasOwnProperty()函數(shù)用于指示一個(gè)**對(duì)象自身(不包括原型鏈)**是否具有指定名稱的屬性。如果有,返回true,否則返回false。
說簡單點(diǎn),它能幫你指向你當(dāng)前循環(huán)的對(duì)象,而過濾掉原型鏈上其它對(duì)象,因?yàn)樵诠ぷ髦形覀兒茈y保證其他人是否會(huì)修改原型鏈,這樣做會(huì)更為保險(xiǎn),那么修改代碼:
var obj = {name:"echolun",age:"24",sex:"male" }, objName=[], //用來裝對(duì)象屬性名 objVal=[]; //用來裝對(duì)象屬性值 Object.prototype.game="lastgame"; for(var i in obj){if(obj.hasOwnProperty(i)) {objName.push(i);objVal.push(obj[i]);} } console.log(objName,objVal); }看吧,這下就過濾掉game了。
1.hasOwnProperty()函數(shù)用于指示一個(gè)對(duì)象自身(不包括原型鏈)是否具有指定名稱的屬性。如果有,返回true,否則返回false。
2.說簡單點(diǎn),它能幫你指向你當(dāng)前循環(huán)的對(duì)象,而過濾掉原型鏈上其它對(duì)象,因?yàn)樵诠ぷ髦形覀兒茈y保證其他人是否會(huì)修改原型鏈,這樣做會(huì)更為保險(xiǎn)。
3.因?yàn)?for in 循環(huán)總是遍歷整個(gè)原型鏈,所以當(dāng)遍歷多繼承的對(duì)象時(shí)效率較低。
4.為了檢查某個(gè)對(duì)象是否擁有不在原型鏈上的自定義屬性,就有必要用到 hasOwnProperty 方法,任何一個(gè)對(duì)象都具有該方法,它繼承自 Object.prototype。
5.當(dāng)檢測(cè)某個(gè)對(duì)象是否擁有某個(gè)屬性時(shí),hasOwnProperty 是唯一可以完成這一任務(wù)的方法,在 for in 循環(huán)時(shí),建議增加 hasOwnProperty 進(jìn)行判斷,可以有效避免擴(kuò)展本地原型而引起的錯(cuò)誤。
6.我們無法完全檢測(cè)某個(gè)屬性是否是undefined,因?yàn)閷傩杂锌赡艽嬖?#xff0c;但其值為undefined。
7.hasOwnProperty 是Javascript中唯一一個(gè)可以處理對(duì)象屬性而不遍歷原型鏈的方法。
hasOwnProperty()的主要作用就是在多重循環(huán)中過濾掉不符合條件的對(duì)象,減少遍歷次數(shù),和其他編程語言中的continue和break類似。
屬性名的遍歷
Symbol 作為屬性名,遍歷對(duì)象的時(shí)候,該屬性不會(huì)出現(xiàn)在 for...in 、 for...of 循環(huán)中,也不 會(huì)被 Object.keys() 、 Object.getOwnPropertyNames() 、JSON.stringify() 返回。
但是,它也不是私有屬性,有一個(gè) Object.getOwnPropertySymbols() 方法,可以獲取指定對(duì)象的所有 Symbol 屬性名。該方法返回一個(gè)數(shù)組,成員是當(dāng)前對(duì)象的所有用作屬性名的 Symbol 值。
. const obj = {}; . let a = Symbol('a'); . let b = Symbol('b'); . . obj[a] = 'Hello'; . obj[b] = 'World'; . . const objectSymbols = Object.getOwnPropertySymbols(obj); . . objectSymbols . // [Symbol(a), Symbol(b)]下面是另一個(gè)例子, Object.getOwnPropertySymbols() 方法與 for...in 循
環(huán)、 Object.getOwnPropertyNames 方法進(jìn)行對(duì)比的例子。
另一個(gè)新的 API, Reflect.ownKeys() 方法可以返回所有類型的鍵名,包括常規(guī)鍵名和 Symbol鍵名
. let obj = { . [Symbol('my_key')]: 1, . enum: 2, . nonEnum: 3 . }; . . Reflect.ownKeys(obj) . // ["enum", "nonEnum", Symbol(my_key)]由于以 Symbol 值作為鍵名,不會(huì)被常規(guī)方法遍歷得到。我們可以利用這個(gè)特性,為對(duì)象定義一些非私有的、但又希望只用于內(nèi)部的方法。
具體可以參考 https://www.cnblogs.com/zhenggc99/p/14718859.html
總結(jié)
以上是生活随笔為你收集整理的如何解决for in 循环无法遍历symbol key的问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 互联网广告投放平台宣传文案30句
- 下一篇: 李宗盛最好听的十首歌试听