1. 程式人生 > 實用技巧 >JS記錄集合中遇到的報錯

JS記錄集合中遇到的報錯

Uncaught TypeError: Cannot read property 'hasOwnProperty' of undefined

var collection = {
    "2548": {
      "album": "Slippery When Wet",
      "artist": "Bon Jovi",
      "tracks": [ 
        "Let It Rock", 
        "You Give Love a Bad Name" 
      ]
    },
    "2468": {
      "album": "1999",
      "artist": "Prince",
      "tracks": [ 
        "1999", 
        "Little Red Corvette" 
      ]
    },
    "1245": {
      "artist": "Robert Palmer",
      "tracks": [ ]
    },
    "5439": {
      "album": "ABBA Gold"
    }
};

function updateRecords(id, prop, value) {
  if(value == "") {
    delete collection["id"][prop];
  }else if(prop == "tracks") {
    if(!collection["id"].hasOwnProperty("tracks")){
      collection["id"].tracks = [];
    }
    collection["id"].tracks.push(value);
  }else {
    collection["id"][prop] = value;
  }
  return collection;
}

// 你可以修改這一行來測試你的程式碼
updateRecords(5439, "tracks", "ABBA");

思路:

  • 根據報錯第一反應檢視hasOwnProperty是否正確使用。

    1、直接帶入資料,可以正常判斷
      collection["5439"].hasOwnProperty("tracks") //fasle
      collection[5439].hasOwnProperty("tracks") //false
    
    2、給id賦值,再執行
    var id = 5439;
    collection["id"].hasOwnProperty("tracks") //報錯:Cannot read property 'hasOwnProperty' of undefined
    
    //把id的雙引號去掉後,可以正常判斷
    collection[id].hasOwnProperty("tracks") //false
    

    由此可見是獲取物件屬性的方法有問題,導致出現這個情況

  • 把所有id的引號取消後,可以正常執行

    function updateRecords(id, prop, value) {
      if(value == "") {
        delete collection[id][prop];
      }else if(prop == "tracks") {
        if(!collection[id].hasOwnProperty("tracks")){
          collection[id].tracks = [];
        }
        collection[id].tracks.push(value);
      }else {
        collection[id][prop] = value;
      }
      return collection;
    }
    

物件屬性的讀取

讀取物件的屬性,有兩種方法,一種是使用點運算子,還有一種是使用方括號運算子。

obj.foo; 	//foo是字串
obj["foo"];	//foo是鍵名
obj[foo];	//foo是變數
obj[0.7]

如果使用點運算子,foo就是字串;

如果使用方括號運算子,用雙引號的話foo是鍵名;不使o用引號,那麼foo就是一個變數。

數值鍵名不能使用點運算子(因為會被當成小數點),只能使用方括號運算子。物件obj的數字鍵0.7,加不加引號都可以,因為會被自動轉為字串。

總結

回到一開始的問題,其實出現報錯的情況也很簡單,就是腦子宕機了。

collection["id"]裡的id實際上已經不是變量了,而是一個鍵名,而collection裡沒有id這個屬性,自然也就沒有在裡面定義id為物件,所以使用使用物件的方法hasOwnProperty()就會報錯了。

最後發現一開始的報錯也很明確了:

 Cannot read property 'hasOwnProperty' of undefined
 無法讀取未定義的屬性“hasOwnProperty” 

送給自己一句話:努力學好基礎跟英語吧。