Игнорировать ошибку. Оператор «in» четко определен в ECMA 262-5.1 / июнь 2011 sec-11.8.7
По-видимому, только три результата для 'someProperty' in anObject
, который является одним из: true
, false
или TypeError
, - исключение. Когда оно оценивается как true
, тогда определенно есть 'someProperty' in anObject
. Когда он оценивается как false
, определенно нет 'someProperty' in anObject
. Когда выбрасывается TypeError
, это определенно не 'someProperty' in anObject
, потому что anObject
является либо нулевым, либо вовсе не объектом. Все это кажется мне очень понятным. Когда я хочу узнать, есть ли у объекта свойство, и мне все равно, является ли это свойство собственным свойством объекта или оно наследуется, и мне все равно, какое значение имеет свойство, тогда я просто ищу 'someProperty' in anObject
.
Предупреждение
Осторожно: некоторые заставят вас проверить anObject.someProperty !== undefined
, но на самом деле это не проверка, есть ли у объекта свойство. Он проверяет, имеет ли объект свойство AND , что значение этого свойства равно NOT undefined. Кто-то может попросить вас проверить anObject.hasOwnProperty('someProperty');
, но это скажет вам только, если объект обладает этим свойством И имеет НЕ как-то его унаследовало. Не веришь мне? Попробуйте следующее:
console.log(document.body.tagName);
// BODY
console.log(document.body.hasOwnProperty('tagName'));
// false, it's inherited
console.log('tagName' in document.body);
// true, it does have the property
document.body.wobbles = undefined;
// new property added to document.body
console.log('wobbles' in document.body);
// true, it does have the property
console.log(document.body.wobbles !== undefined);
// false, the value really IS undefined
Я написал статью об операторе in, которая более подробно описана. Если вы хотите прочитать его, он находится по адресу: http://matthewkastor.blogspot.com/2012/09/Unexpected--in---Compare-with-undefined--or-use-the-hasOwnProperty-method-instead.html Суть в том, что вы должны просто игнорировать эту ошибку и обернуть вещи в блок try catch, если объект может быть нулевым или нет объектом.
function hasProperty(prop, obj) {
try {
return prop in obj;
} catch(e) {
return e;
}
}