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