jslint错误:意外'在'。与undefined比较,或使用hasOwnProperty

时间:2011-07-26 03:24:25

标签: javascript jslint

我有以下javascript函数未通过jslint检查

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

jslint错误

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

我应该忍受jslint错误,还是有更好的方法来确定ActiveXObject? 我找不到跳过此检查的jslint标志?

2 个答案:

答案 0 :(得分:21)

忽略错误。 “in”运算符在ECMA 262-5.1 / June 2011 sec-11.8.7

中明确定义

'someProperty' in anObject似乎只有三个结果,其中之一是:truefalse或抛出TypeError个异常。当评估为true时,肯定有'someProperty' in anObject。当评估为false时,肯定没有'someProperty' in anObject。当抛出TypeError时,绝对不会'someProperty' in anObject,因为anObject为空或者根本不是对象。这一切对我来说都很清楚。当我想知道对象是否有属性时,我不在乎该属性是对象自己的属性还是被继承,我不关心属性的值是什么,然后我只是寻找{ {1}}。

警告

警告:有些人会检查'someProperty' in anObject,但这并没有真正检查对象是否具有该属性。它正在做的是检查对象是否具有 AND 属性,该属性的值是 NOT 未定义。有些人会检查anObject.someProperty !== undefined,但这只会告诉你对象是否具有该属性 AND NOT 以某种方式继承它。不相信我?请尝试以下方法:

anObject.hasOwnProperty('someProperty');

我写过一篇关于“in”运算符的文章,该文章详细介绍。如果您想阅读它,请访问: http://matthewkastor.blogspot.com/2012/09/Unexpected--in---Compare-with-undefined--or-use-the-hasOwnProperty-method-instead.html最重要的是,如果对象可能为null或不是对象,则应该忽略此错误并将其包装在try catch块中。

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

答案 1 :(得分:17)

我认为JSLint要求您尝试:

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

或者与“未定义”进行比较的其他建议:

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

就个人而言,我更喜欢前者。

阅读评论后,如果JSLint停止抱怨,in似乎实际上有用,否则我会尝试上面的选项2.