0%

JS面試題練習- 判斷 Obj 是否存在某個屬性

前言

網路上看到面試題 ,也來拿來記錄練習


看到一題面試題

1
2
3
4
5
6
7
8
9
/**
* 判斷對象中是否存在某個屬性
* @param{ Object } obj 對象
* @param{ String } key 屬性
*/

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;
}

//這樣的寫法是錯誤的 ,是只會判斷key的值

//應該 改成
function hasProperty(obj,key){
return obj[key] !== undefined;
}

但上面寫法會遇到一個問題

1
2
var obj = { a : undefined};
console.log( hasProperty(obj , 'a')) // false

本來 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')) // true
console.log( hasProperty(Object.keys(obj))) // ['a' ,'b' ]

這樣又可以判斷 上面是否有包含 a 這個屬性 (但是 a 這個屬性顯示undefined)

但是如果

1
2
3
4
Object.defineProperty(obj,'c'{
enumerable:false,
value:1,
})

用上方的方式 加了一個C Obj進去
內容為:不可遍歷,值等於1

1
2
console.log(obj.c);   //true    <---------判斷得出來
console.log(hasProperty(obj,'c')); // false <-----------但上面的方法會找不到 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')); // true <-----------找到 C

那如果改成 toString

1
2
3
console.log(hasProperty(obj,'toString'));   //false     <-------------判斷不出來原型鏈上的東西 只能判斷自己的property

console.log(obj.toString) // [Function :toString] 顯示是有這個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')); // true
console.log(hasProperty(obj,'c')); // true
console.log(hasProperty(obj,'toString')); // true

你的支持是我活力的來源 :)