我有以下javascript函数未通过jslint检查
function hasActiveX() {
return ('ActiveXObject' in window);
}
jslint错误
Unexpected 'in'. Compare with undefined, or use the hasOwnProperty method instead.
我应该忍受jslint错误,还是有更好的方法来确定ActiveXObject? 我找不到跳过此检查的jslint标志?
答案 0 :(得分:21)
忽略错误。 “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
为空或者根本不是对象。这一切对我来说都很清楚。当我想知道对象是否有属性时,我不在乎该属性是对象自己的属性还是被继承,我不关心属性的值是什么,然后我只是寻找{ {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.