1. 程式人生 > 實用技巧 >hasOwnProperty的作用、配合for in使用 、key in Object判讀key

hasOwnProperty的作用、配合for in使用 、key in Object判讀key

我們都知道,物件以 key|value的形式存在 它和陣列一樣可以通過for in 去遍歷,拿到遍歷物件的所有key

某些idea在使用for in 時,提示程式碼片段中就有出現以下這種情況! (下圖)

  • 我們可以看到,裡面多了一句 Object.hasOwnProperty(key)的這個玩意,那麼它的作用是什麼?

Talk is cheap. Show me the code.

/* OK,我們先整一個物件 */
var people = {
      name: '李四',
      age: 18,
      work: '碼農'
};

/* 然後我們用for in 去讀一遍 people 這個物件的key */
for(const i in people) {
    console.log(i);
}

/* 
      log => name, age, work 
      嗯,輸出符合預期,那麼我們加一點點騷操作,在 people 物件的原型下掛多一個名為 homeAddress 的key,
      然後輸出一次 people 
*/
people.__proto__.homeAddress = '北京東三環';
console.log(people)

  • 可以發現,people 裡面並沒有 homeAddress 這個屬性,那麼我們能否訪問(讀取)得到它呢?
console.log(people.homeAddress);
/* log => 北京東三環 */
  • 對的,我們發現它可讀,但是直接列印 people 時候,它並不存在於 people 物件本身上,它被掛載於 people 物件的原型上,即 people.__proto__
  • 那麼我們使用 for in 去遍歷物件的時候以及用 key in Object 去查詢物件是否包含某個key的時候,都會去查詢原型(__proto__)上是否包含這個key
for (const key in people) {
      console.log(key)
};
/* log => name, age, work, homeAddress */
'homeAddress' in people;
/* log => true */
  • 正常情況下其實我們比較少用到Object.hasOwnProperty(key)這個方法,但是回去閱讀框架原始碼,底層封裝的童鞋們,就會經常在程式碼中看到這個方法,
    它的主要作用就是把判斷範圍縮小至物件本身的key
people.hasOwnProperty('name'); //log => true
people.hasOwnProperty('age'); //log => true
people.hasOwnProperty('work'); //log => true
people.hasOwnProperty('homeAddress'); //log => false