前言
網路上看到面試題 ,也來拿來記錄練習
看到一題面試題
1 2 3 4 5 6 7 8 9
|
function hasProperty(obj,key){ return key in obj; }
|
上方即為正確答案 ,但在實際形況下 經驗情況不足的我們很少會想到這樣的方式
以下是常見的錯誤整理
1 2 3 4 5 6 7 8 9 10 11
| function hasProperty(obj,key){ return obj.key !== undefined; }
function hasProperty(obj,key){ return obj[key] !== undefined; }
|
但上面寫法會遇到一個問題
1 2
| var obj = { a : undefined}; console.log( hasProperty(obj , 'a'))
|
本來 obj[key] !== undefined;
應該要是 true
但是結果顯示false
所以不能用undefined
來判斷
那該如何判斷呢
1 2 3 4 5 6 7
| function hasProperty(obj,key){ return Object.keys(obj).includes(key) } var obj = { a : undefined ,b : 1}; console.log( hasProperty(obj , 'a')) console.log( hasProperty(Object.keys(obj)))
|
這樣又可以判斷 上面是否有包含 a 這個屬性 (但是 a 這個屬性顯示undefined
)
但是如果
1 2 3 4
| Object.defineProperty(obj,'c'{ enumerable:false, value:1, })
|
用上方的方式 加了一個C
Obj進去
內容為:不可遍歷,值等於1
1 2
| console.log(obj.c); console.log(hasProperty(obj,'c'));
|
接下來也有人會這樣寫
1 2 3 4 5 6 7 8 9
| function hasProperty(obj,key){ return obj.hasOwnProperty(key); } var obj = { a : undefined ,b : 1}; Object.defineProperty(obj,'c'{ enumerable:false, value:1, }) console.log(hasProperty(obj,'c'));
|
那如果改成 toString
1 2 3
| console.log(hasProperty(obj,'toString'));
console.log(obj.toString)
|
所以最好的解法還是用 key... in
1 2 3 4 5 6 7 8 9 10 11 12 13
| function hasProperty(obj,key){ return key in obj; } var obj = { a : undefined ,b : 1}; Object.defineProperty(obj,'c'{ enumerable:false, value:1, })
console.log(hasProperty(obj,'a')); console.log(hasProperty(obj,'c')); console.log(hasProperty(obj,'toString'));
|