JS記錄集合中遇到的報錯
阿新 • • 發佈:2020-07-30
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”
送給自己一句話:努力學好基礎跟英語吧。