Ошибка jslint: Неожиданный 'in'. Сравните с undefined или используйте hasOwnProperty
У меня есть следующая функция javascript, которая не выполняет проверку jslint
function hasActiveX() {
return ('ActiveXObject' in window);
}
Ошибка jslint
Unexpected 'in'. Compare with undefined, or use the hasOwnProperty method instead.
Должен ли я просто жить с ошибкой jslint или есть лучший способ определить ActiveXObject?
Я не могу найти флаг jslint, чтобы пропустить эту проверку?
Ответы
Ответ 1
Я думаю, что JSLint просит вас попробовать:
function hasActiveX() {
return window.hasOwnProperty('ActiveXObject');
}
Или другое предложение сравнения с "undefined":
return (typeof(window.ActiveXObject) != "undefined");
Лично я предпочитаю первый.
После прочтения комментариев кажется, что in
действительно полезен, если JSLint перестанет жаловаться на него, иначе я попробую вариант 2 выше.
Ответ 2
Игнорировать ошибку. Оператор "in" четко определен в ECMA 262-5.1/June 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');
, но это только скажет вам, имеет ли объект свойство AND NOT унаследовал его каким-то образом. Не верьте мне? Попробуйте следующее:
console.log(document.body.tagName);
// BODY
console.log(document.body.hasOwnProperty('tagName'));
// false, it 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 Суть в том, что вы должны просто игнорировать эту ошибку и обернуть вещи в блок catch try, если объект может быть нулевым или не объектом.
function hasProperty(prop, obj) {
try {
return prop in obj;
} catch(e) {
return e;
}
}