Ошибка jslint: неожиданное 'in'. Сравните с undefined или используйте hasOwnProperty - PullRequest
20 голосов
/ 26 июля 2011

У меня есть следующая функция javascript, которая не проходит проверку jslint

  function hasActiveX() {
    return ('ActiveXObject' in window);
  }

Ошибка jslint

Unexpected 'in'. Compare with undefined, or use the hasOwnProperty method instead.

я должен просто жить с ошибкой jslint, или есть лучший способ определить ActiveXObject? Я не смог найти флаг jslint, чтобы пропустить эту проверку?

Ответы [ 2 ]

21 голосов
/ 09 сентября 2012

Игнорировать ошибку. Оператор «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;
    }
}
17 голосов
/ 26 июля 2011

Я думаю, что JSLint просит вас попробовать:

function hasActiveX() {
    return window.hasOwnProperty('ActiveXObject');
}

Или другое предложение по сравнению с "undefined":

return (typeof(window.ActiveXObject) != "undefined");

Лично я предпочитаю первое.

После прочтения комментариев кажется, что in действительно полезно, если JSLint перестанет жаловаться на это, в противном случае я бы попробовал вариант 2 выше.

...