【问题标题】:jslint giving expected a string and instead saw {a}jslint 给出了预期的字符串,而是看到了 {a}
【发布时间】:2013-09-02 06:22:03
【问题描述】:

我有以下似乎正确的代码片段,但 jslint 不喜欢它。

var VALID_TYPE = {
    "stringType" : "string",
    "arrayType" : "array",
    "objectType" : "object"
},
    DEFAULT_FIRST = 1, DEFAULT_LAST = 1, PRIMITIVE_TYPE = {
    "stringType" : "string",
    "arrayType" : "array",
    "objectType" : "object",
    "undefinedType" : "undefined",
    "booleanType" : "boolean",
    "numberType" : "number"
};
VALID_TYPE.toString = function () {
    var types = [], currentType;
    for (currentType in this) {
        if (typeof this[currentType] === PRIMITIVE_TYPE.stringType) {
            types.push(this[currentType]);
        }
    }
    var outputString = types.join(', ');
    return outputString;
};

错误的行是这样的,在“.”处: if (typeof this[currentType] === PRIMITIVE_TYPE.stringType) {

错误的确切文本是: 需要一个字符串,但看到的是 '.'。

toString() 按预期执行。除了将表达式的右侧放入另一个变量之外,我看不到应该更改什么以避免错误。 jslinterrors.com 上尚未描述该错误。

【问题讨论】:

  • 当您将 typeof 与非常数进行比较时,JSLint 似乎不喜欢它。不知道为什么...

标签: javascript jslint


【解决方案1】:

正如 @SLaks 在 cmets 中所述,当 JSLint 遇到比较运算符时,其中一个操作数是 typeof 表达式而另一个操作数不是字符串文字时,会发出警告。

这是执行此检查的代码的精简版本:

function relation(s, eqeq) {
    var x = infix(s, 100, function (left, that) {
        // ...
        if (are_similar(left, right) ||
                ((left.id === '(string)' || left.id === '(number)') &&
                (right.id === '(string)' || right.id === '(number)'))) {
            that.warn('weird_relation');
        } else if (left.id === 'typeof') {
            if (right.id !== '(string)') {
                right.warn("expected_string_a", artifact(right));
            } else if (right.string === 'undefined' || right.string === 'null') {
                left.warn("unexpected_typeof_a", right.string);
            }
        } else if (right.id === 'typeof') {
            if (left.id !== '(string)') {
                left.warn("expected_string_a", artifact(left));
            } else if (left.string === 'undefined' || left.string === 'null') {
                right.warn("unexpected_typeof_a", left.string);
            }
        }
        // ...
    });
    // ...
}

给出特定警告的唯一其他时间是 JSLint 遇到未引用的 JSON 属性时:

{
    a: 1
}

一有机会,我会在 http://jslinterrors.com 上解决这个问题。

【讨论】:

    【解决方案2】:

    toString() 按预期执行。

    代码完全有效,所以可以。

    请记住,jsLint 不是在寻找错误;它正在寻找它认为不好的做法。

    但这些事情并不总是在每种情况下都绝对是错误的;通常它有一个合法的用例,如果您遇到其中一种情况,那么您仍然会收到错误,但只需忽略它。

    应将 Lint 错误视为指导,而不是严格遵守并导致构建失败。

    您可能还想考虑使用 jsHint 而不是 jsLint。 jsHint 是基于 jsLint 的,但对于它所抱怨的内容往往更加务实。

    希望对您有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-21
      • 2011-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-24
      • 2013-05-12
      相关资源
      最近更新 更多