JS - 面向?qū)ο?- 屬性遍歷

對象屬性分類

對于屬性遍歷而言玖绿,可以將對象屬性分為是否可枚舉斑匪、是否為繼承 兩種

let ary = ['a', 'b', 'c']

ary 數(shù)組中蚀瘸,可枚舉屬性是對應(yīng)的索引 0, 1, 2 庶橱,不可枚舉的是 length

對象屬性配置

對象中,屬性是否可枚舉可以通過 Object.defineProperty 設(shè)定

class Car {                                          // 創(chuàng)建類
  constructor(brand, model, color) {                
    this.brand = brand
    this.model = model
    this.color = color
  }
}

let mycar = new  Car('Tesla', 'model 3', 'red')     // 沒有的話 new 一個(gè)就好啦

Object.defineProperty(mycar ,"color",{
        value: "red",
        enumerable: false,       //是否可枚舉, 默認(rèn)值 false
        configurable: false,    //是否可配置布近,默認(rèn)值 false
        writable: false,        //沒有 writable 使用默認(rèn)值 false
  });

對象創(chuàng)建完成撑瞧,在控制臺內(nèi)通過顏色可以判斷不可枚舉屬性预伺,但作為一個(gè)嚴(yán)謹(jǐn)?shù)某绦騿T,當(dāng)然需要更科學(xué)的辦法啦

可枚舉屬性

Object.keys(o)

按順序遍歷返回一個(gè)數(shù)組脏嚷,其包含對象 o 自身(不包括原型)的所有可枚舉屬性的名稱

Object.keys(mycar)          
// ["brand", "model"] 
for...in循環(huán)

該方法會依次訪問一個(gè)對象及其原型鏈中所有可枚舉的屬性父叙,就當(dāng)前對象而言肴裙,效果較Object.keys(o) 相同

for (let i in my car) {
  console.log(i)
}
// brand
// model

但如果繼承的原型鏈上已有可枚舉屬性蜻懦,原型上的 'foo' 也被遍歷進(jìn)來了

mycar.__proto__.foo = 'foo'

for (let i in mycar) {
  console.log(i)
}
// brand
// model
// foo

Object.keys(mycar)          
// ["brand", "model"] 

所以得再過濾下宛乃,使用 hasOwnProperty 過濾繼承屬性,返回布爾值

for(let i in mycar){
  // 此處可以使用 mycar.hasOwnProperty(i)乔煞,
  // 以安全的角度看用 Object.prototype.hasOwnProperty.call(mycar,i) 
  if(Object.prototype.hasOwnProperty.call(mycar,i)){
    console.log(i)
  }
}
// brand
// model

所有屬性

Object.getOwnPropertyNames(o)

該方法返回一個(gè)數(shù)組渡贾,其包含對象 o 所有自有的屬性(無論是否可枚舉)的名稱

mycar.__proto__.foo = 'foo'

Object.getOwnPropertyNames( mycar )
// ["brand", "model", "color"]

不可枚舉屬性

那既然可枚舉和全部自有屬性都有辦法獲取空骚,要獲取不可枚舉屬性就簡單了

mycar.__proto__.foo = 'foo'

Object.getOwnPropertyNames(mycar).filter(val =>
  !Object.keys(mycar).includes(val)
)
// ["color"]

遍歷順序

值得注意的是,Object.keys() 遍歷順序?qū)Σ煌瑢傩灶愋蜁r(shí)熬甚,先后順序不同

let a = {'zz': 3, 3: 99, 1: 100, 'bb': 0}        
//["1", "3", "zz", "bb"]

引用 MDN 中說明:

一個(gè)對象的屬性名可以是任何有效的 JavaScript 字符串肋坚,或者可以被轉(zhuǎn)換為字符串的任何類型智厌,包括空字符串

也就是說,對象的所有屬性都會通過轉(zhuǎn)換變化為字符串敷扫,而由數(shù)字轉(zhuǎn)過來字符串排序優(yōu)先(此處略有疑問)而 for...in循環(huán) 遍歷順序與 Object.keys() 一致

// 同時(shí)創(chuàng)建多個(gè)變量
let myObj = new Object(),
str = "myString",
rand = Math.random(),
obj = new Object(),
num1 = 23,
num2 = 99,
ary = [1,2];

myObj.type              = "Dot syntax";
myObj["date created"]   = "String with space";
myObj[str]              = "String value";
myObj[rand]             = "Random Number";
myObj[obj]              = "Object";
myObj[ary]              = 'here is a ary'
myObj[num2]             = 'here is a number_2'
myObj[""]               = "Even an empty string";
myObj[num1]             = 'here is a number_1'

for(let i in myObj){console.log(typeof i,' --- ', i, ' --- ',myObj[i])}
// 去下圖...

小結(jié)

  • 遍歷自有屬性:

    • 可枚舉:
      1. Object.keys(o) 遍歷 對象 o 上的所有可枚舉自有屬性
      2. for...in 遍歷對象 o 上所有自有屬性(包括繼承屬性)
    • 可枚舉 + 不可枚舉:
      1. Object.getOwnPropertyNames(o) 遍歷對象 o 上所有自有屬性(無論是否可枚舉)
    • 不可枚舉:
      1. 通過 Object.getOwnPropertyNames(o) 獲取所有自有屬性,在通過 Object.keys(mycar) 獲取 自有可枚舉屬性合溺,在使用 filter 過濾
  • 遍歷順序:以屬性設(shè)定時(shí)順序?yàn)闇?zhǔn)棠赛,數(shù)字例外優(yōu)先排序(僅參考)

  • 判斷是否屬于自有屬性(返回布爾值):
    1. 普通做法 mycar.hasOwnProperty(i)
    2. 更安全的做法 Object.prototype.hasOwnProperty.call(mycar,i)

統(tǒng)計(jì)表

源自 MDN ,關(guān)于屬性的 枚舉,繼承 統(tǒng)計(jì)表

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市律罢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌歌逢,老刑警劉巖秘案,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阱高,死亡現(xiàn)場離奇詭異赤惊,居然都是意外死亡凰锡,警方通過查閱死者的電腦和手機(jī)裕膀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來野揪,“玉大人瞧栗,你說我怎么就攤上這事〖?郑” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵殴边,是天一觀的道長。 經(jīng)常有香客問我锤岸,道長,這世上最難降的妖魔是什么是偷? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任拳氢,我火速辦了婚禮募逞,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘馋评。我一直安慰自己,他們只是感情好留特,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布纠脾。 她就那樣靜靜地躺著,像睡著了一般磕秤。 火紅的嫁衣襯著肌膚如雪乳乌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天市咆,我揣著相機(jī)與錄音汉操,去河邊找鬼。 笑死蒙兰,一個(gè)胖子當(dāng)著我的面吹牛磷瘤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搜变,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼采缚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挠他?” 一聲冷哼從身側(cè)響起扳抽,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎殖侵,沒想到半個(gè)月后贸呢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拢军,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年楞陷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茉唉。...
    茶點(diǎn)故事閱讀 40,769評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡固蛾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出度陆,到底是詐尸還是另有隱情艾凯,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布懂傀,位于F島的核電站趾诗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鸿竖。R本人自食惡果不足惜沧竟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望缚忧。 院中可真熱鬧悟泵,春花似錦、人聲如沸闪水。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至衡招,卻和暖如春每强,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背空执。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工辨绊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宣鄙。 一個(gè)月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓框冀,卻偏偏與公主長得像敏簿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子惯裕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 概要 64學(xué)時(shí) 3.5學(xué)分 章節(jié)安排 電子商務(wù)網(wǎng)站概況 HTML5+CSS3 JavaScript Node 電子...
    阿啊阿吖丁閱讀 9,223評論 0 3
  • ??面向?qū)ο螅∣bject-Oriented甫菠,OO)的語言有一個(gè)標(biāo)志寂诱,那就是它們都有類的概念安聘,而通過類可以創(chuàng)建任意...
    霜天曉閱讀 2,112評論 0 6
  • 《日精進(jìn)打卡》 姓名:徐建蓉 公司名稱:寧波大發(fā)化纖有限公司 《幸福精進(jìn)》學(xué)習(xí)營第41期努力組 ...
    群_ff9f閱讀 488評論 0 1
  • 阿爸父泉粉, 我知道你的意思是好的榴芳, 這一切大不過你的愛, 可是翠语, 我突然不會笑了, 主啊点骑,懇求你, 將喜樂為我奪回黑滴。...
    輕小暖閱讀 723評論 1 3
  • 我真覺得活著讓我覺得好累晚缩,每次每次我想珍惜的東西都已經(jīng)在放棄我媳危,而我卻后知后覺。感覺自己跟一個(gè)傻瓜一樣待笑。 你...
    懷挺小姐閱讀 191評論 0 0