意外的“。”从包装表达式到链

Unexpected '.' from wrapped expression to chain

我有这个计算总数的方法,其中一部分是在 JS Lint 中给出警告。我们正在努力让工作中的 JS Lint 检查更清晰,所以我想看看是否有一种合理的方法来解决这个我没有想到的问题。

calculateTotal = function() {
    var hours = parseFloat($hours.val());
    var rate = parserFloat($rate.val());
    var total = '';

    if (!isNaN(hours) && !isNaN(rate)) {
        // This throws the error.
        total = (rate * hours).toFixed(2);
    }

    $total.val(total);
}

如果我执行以下操作,我可以避免该消息:

total = rate * hours;
total = total.toFixed(2);

对我来说有点太冗长了,直接跳过去,但这可能是最好的选择。

我查看了 ,并考虑过 Number(rate * hours).toFixed(2),但性能(略微)较低,而且从所有关于使用 [=13 的警告开始是一个糟糕的先例=] 如对那里接受的答案的回应所述。

如果我的上述尝试是让 JS Lint 停止抱怨的最佳方式,这可能没有实际意义,但我想听听其他人的意见。

TL;DR

JSLint 将强制您将 toFixed() 从括号后面移开。我建议移动它的最不烦人的地方是在 $total.val(total) 作业中。

这在 JSLint.com:

上保持原样
/*jslint white:true, browser:true */
/*global $hours, $rate, $total */

var calculateTotal = function() {
    "use strict";
    var hours = parseFloat($hours.val());
    var rate = parseFloat($rate.val());
    var total;

    if (!isNaN(hours) && !isNaN(rate)) {
        // This throws the error.
        total = rate * hours;
    }

    $total.val(total.toFixed(2));  // moved `toFixed` to here
};

再长一点...

我针对最新版本的 JSLint 进行了测试,但它在 left_check in JSLint's code, here:

function left_check(left, right) {

// Warn if the left is not one of these:
//      e.b
//      e[b]
//      e()
//      identifier

    var id = left.id;
    if (
        !left.identifier &&
        (
            left.arity !== "binary" ||
            (id !== "." && id !== "(" && id !== "[")
        )
    ) {
        warn("unexpected_a", right);
        return false;
    }
    return true;
}

left 本质上是 (rate & hours),右边是 .,在这种情况下,toFixed 是下一个标记。

尽管从注释中假设代码功能很危险,但我认为注释告诉我们 JSLint 的来源——它希望方法只在对象上调用,而不是在操作上调用,包括经常在内部发生的类型强制转换他们。它几乎必须让您进行“流畅”的调用,您可以在其中链接方法,唯一可以进行方法调用的有效内容是...

  • 一个对象:e
  • 一个对象的属性:e.b
  • 集合中的一个 属性:e[key]
  • 函数的return值:e()

只是仔细检查一下,因为您的构造曾经在“旧 JSLint”中工作(last version before JSLint for ES6), I asked Douglas Crockford. He's pretty terse, but he did confirm JSLint is working as intended

抱歉,我无法提供更多帮助。我认为有些地方 (someExpression).someMethod() 是权宜之计,但也要了解 JSLint 的来源。如果您有可能进行类型强制,请显式强制。

有趣的问题;谢谢提问。