我怎样才能使用jslint和instanceof?

时间:2016-10-03 16:47:00

标签: javascript jslint

我得到一个"错误"在这一行:

var test = selector instanceof Priv.Constructor;

错误是:

`Unexpected 'instanceof'.`

我设置了最小标志:

/*jslint
    browser
    this
*/

/*global
    window
*/

并且可以在这里找到任何原因:

http://jslint.com/help.html

我不想压制警告,我想知道为什么会这样。

2 个答案:

答案 0 :(得分:3)

看起来答案是JSLint认为instanceof会产生意外/意外结果。

instanceof's page at MDN

看这个
var simpleStr = 'This is a simple string';
simpleStr instanceof String; // *returns false*, checks the prototype chain, finds undefined

那是出乎意料的!您必须使用String进行初始化才能获得预期结果。

var myString  = new String();
var newStr    = new String('String created with constructor');

myString  instanceof String; // returns true
newStr    instanceof String; // returns true

我相信"对" JSLint的答案是尝试Object.prototype.toString.call所描述的here技巧,如下所示:

"[object String]" === Object.prototype.toString.call("adsfsad");
"[object String]" === Object.prototype.toString.call(myString);
"[object String]" === Object.prototype.toString.call(newStr);

一切都是真的。

Crockford之前说过,JSLint应该可以帮助你防止使用看起来像错误的习惯用语或者产生意想不到的结果的代码。这就是在这里发生的事情,牺牲了some performance。虽然记得not to fret with micro-optimizations

答案 1 :(得分:1)

jslint.conf文件中,将“expr”选项设置为true以取消该警告:

{
    "evil":false,
    "indent":2,
    "vars":true,
    "passfail":false,
    "plusplus":false,
    "predef": "module,require",
    "expr" : true
}

//更新问题

据我所知,这是因为你将它作为一个分配线使用。虽然我的JSLint本地副本没有为它抛出那个错误,但我可以想象它就像一个悬空的表达式赋值。尝试将表达式包装在括号中以确保JSLint不认为它是悬空的,例如

var test = (selector instanceof Priv.Constructor);

看看是否能解决问题。如果没有,请查看是否通过独立检查获得错误,例如:

if(selector instanceof Priv.Constructor){ console.log('it is an instance');}

最后,它可能是您的代码中较早出现的内容,而且它只是在它到达instanceof之前没有得到应该关闭之前语句的东西,在这种情况下“错误的“错误是从你的角度抛出的。