方法一:(不全面)
/**
* 判断对象中是否存在某个属性
* @param {Object} obj 对象
* @param {String} key 属性名
*/
function hasProperty(obj, key) {
return obj[key] !== undefined
}
此方式一般情况下可行,但是当对象中该属性的值为undefined时,即使对象中有这个属性,该方法也会返回false。
方法二:(不全面)
/**
* 判断对象中是否存在某个属性
* @param {Object} obj 对象
* @param {String} key 属性名
*/
function hasProperty(obj, key) {
return Object.keys(obj).includes(key)
}
此方式的含义是使用Object.keys(obj)可以得到对象中的所有属性并返回一个数组,使用数组的includes方法判断该属性是否存在这个数组当中,但是当使用以下方式给对象添加了一个属性后,此方式就不适用了。
let obj = {
a: 1,
b: undefined,
c: {
d: 2
}
}
Object.defineProperty(obj, 'c', {
enumerable: false,
value: 1
})
/**
* 判断对象中是否存在某个属性
* @param {Object} obj 对象
* @param {String} key 属性名
*/
function hasProperty(obj, key) {
console.log('obj', obj);
return Object.keys(obj).includes(key)
}
console.log(hasProperty(obj, 'c'));
方法三:(不全面)
使用obj.hasOwnProperty(key)判断
let obj = {
a: 1,
b: undefined,
c: {
d: 2
}
}
Object.defineProperty(obj, 'c', {
enumerable: false,
value: 1
})
console.log(obj);
/**
* 判断对象中是否存在某个属性
* @param {Object} obj 对象
* @param {String} key 属性名
*/
function hasProperty(obj, key) {
return obj.hasOwnProperty(key)
}
console.log(hasProperty(obj, 'c'));
console.log(hasProperty(obj, 'toString'));
此方式大多情况下都是可以的,但是当这个属性实在原型链上时无法判断,按照上面的代码,检测属性’c‘和’toString‘是否在obj上,测试结果如下:
方法四:(全面)
使用关键字in,可以在原型链上找到。
let obj = {
a: 1,
b: undefined,
c: {
d: 2
}
}
Object.defineProperty(obj, 'c', {
enumerable: false,
value: 1
})
console.log(obj);
/**
* 判断对象中是否存在某个属性
* @param {Object} obj 对象
* @param {String} key 属性名
*/
function hasProperty(obj, key) {
return key in obj
}
console.log('a是否存在obj中', hasProperty(obj, 'a'));
console.log('b是否存在obj中', hasProperty(obj, 'b'));
console.log('c是否存在obj中', hasProperty(obj, 'c'));
console.log('toString是否存在obj中', hasProperty(obj, 'toString'));
测试结果如下:
总结:综上所述,判断一个对象中是否存在某个属性需要用到关键字in,语法为:对象名 in 属性名。