讓我們來看看最常用的幾種方法。
1. 真值檢查
有一個(gè)很簡(jiǎn)單的方法藻肄,就是簡(jiǎn)單的檢查房產(chǎn)是否真實(shí)。
const myObj = {
a: 1,
b: 'some string',
c: [0],
d: {a: 0},
e: undefined,
f: null,
g: '',
h: NaN,
i: {},
j: [],
deleted: 'value'
};
delete myObj.deleted;
console.log(!!myObj['a']); // 1, true
console.log(!!myObj['b']); // 'some string', true
console.log(!!myObj['c']); // [0], true
console.log(!!myObj['d']); // {a: 0}, true
console.log(!!myObj['e']); // undefined, false
console.log(!!myObj['f']); // null, false
console.log(!!myObj['g']); // '', false
console.log(!!myObj['h']); // NaN, false
console.log(!!myObj['i']); // {}, true
console.log(!!myObj['j']); // [], true
console.log(!!myObj['deleted']); // false
正如你所看到的拒担,這導(dǎo)致了幾個(gè)假值的問題嘹屯,所以使用這種方法時(shí)要非常小心。
2. in 操作符
如果一個(gè)屬性存在于一個(gè)對(duì)象或其原型鏈上从撼,in操作符返回true州弟。
const myObj = {
someProperty: 'someValue',
someUndefinedProp: undefined,
deleted: 'value'
};
delete myObj.deleted;
console.log('someProperty' in myObj); // true
console.log('someUndefinedProp' in myObj); // true
console.log('toString' in myObj); // true (inherited)
console.log('deleted' in myObj); // false
in操作符不會(huì)受到假值問題的影響。然而谋逻,它也會(huì)對(duì)原型鏈上的屬性返回true呆馁。這可能正是我們想要的,如果我們不需要對(duì)原型鏈上對(duì)屬性進(jìn)行判斷毁兆,可以使用下面這種方法。
3. hasOwnProperty()
hasOwnProperty()繼承自O(shè)bject.HasOwnProperty()阴挣。和in操作符一樣气堕,它檢查對(duì)象上是否存在一個(gè)屬性,但不考慮原型鏈。
const myObj = {
someProperty: 'someValue',
someUndefinedProp: undefined,
deleted: 'value'
};
delete myObj.deleted;
console.log(myObj.hasOwnProperty('someProperty')); // true
console.log(myObj.hasOwnProperty('someUndefinedProp')); // true
console.log(myObj.hasOwnProperty('toString')); // false
console.log(myObj.hasOwnProperty('deleted')); // false
不過要注意的一點(diǎn)是茎芭,并不是每個(gè)對(duì)象都繼承自O(shè)bject揖膜。
const cleanObj = Object.create(null);
cleanObj.someProp = 'someValue';
// TypeError: cleanObj.hasOwnProperty is not a function
console.log(cleanObj.hasOwnProperty('someProp'));
如果遇到這種罕見的情況,還可以按以下方式使用梅桩。
const cleanObj = Object.create(null);
cleanObj.someProp = 'someValue';
console.log(({}).hasOwnProperty.call(cleanObj,'someProp')); // true
總之
這三種方法都有其適合使用的場(chǎng)景壹粟,重要的是需要我們要熟悉它們的區(qū)別,這樣才能選擇最好的一種宿百,以便讓我們的代碼能夠按照期望運(yùn)行趁仙。