Подтвердить что ты не робот

Ошибка 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, чтобы пропустить эту проверку?

4b9b3361

Ответ 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;
    }
}