如何使用 jslint 和 instanceof?

How can I use jslint and instanceof?

我在这条线上收到 "error":

var test = selector instanceof Priv.Constructor;

错误是:

`Unexpected 'instanceof'.`

我设置了最少的标志:

/*jslint
    browser
    this
*/

/*global
    window
*/

并且可以在这里找到关于原因的任何信息:

http://jslint.com/help.html

我不想取消警告,我想了解它为什么会出现。

在您的 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);

然后看看是否可以解决问题。如果不是,请查看是否通过独立检查 w/o 赋值得到错误,例如:

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

最后,很可能是您代码中较早的部分损坏了,只是它没有得到应该在到达 instanceof 之前关闭前一条语句的内容,在这种情况下"wrong" 错误是从您的角度来看抛出的。

看起来答案是 JSLint 相信 instanceof 可以产生 unintended/unexpected 结果。

看看这个,来自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 的 "right" 答案是尝试 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. Though remember not to fret with micro-optimizations!

为代价