Javascript 意外'';从包装表达式到链

Javascript 意外'';从包装表达式到链,javascript,jslint,Javascript,Jslint,我有一个计算总数的方法,其中一部分是在JS Lint中给出警告。我们试图在工作中进行更清洁的JS皮棉检查,所以我想看看是否有一种合理的方法来解决这个问题,而我并没有想到 calculateTotal = function() { var hours = parseFloat($hours.val()); var rate = parserFloat($rate.val()); var total = ''; if (!isNaN(hours) &&

我有一个计算总数的方法,其中一部分是在JS Lint中给出警告。我们试图在工作中进行更清洁的JS皮棉检查,所以我想看看是否有一种合理的方法来解决这个问题,而我并没有想到

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)
,但这(略微)性能较差,而且如果一开始就出现所有关于使用
String()
的警告,这将是一个不好的先例,因为这些警告都是针对那里被接受的答案而提出的

如果我的上述尝试是让JS Lint停止抱怨的最佳方式,那么这可能是毫无意义的,但我希望听取其他人的意见。

TL;博士 JSLint将强制您从括号后面移动
toFixed()
。我建议将其移动到
$total.val(total)
作业中最不烦人的地方

这根棉绒的颜色如下所示:


再长一点。。。 我在JSLint的最新版本上试用了它,它在以下位置运行:

左侧
基本上是
(费率和小时数)
,右侧是
,在这种情况下,下一个标记是
toFixed

尽管从注释中假设代码函数是危险的,但我认为注释告诉我们JSLint的来源——它希望只在对象上调用方法,而不是在操作上调用方法,包括经常在对象内部发生的类型强制。它几乎必须允许您进行“流畅”的调用,在这里您可以链接方法,并且可以进行方法调用的唯一有效的东西是

  • 对象:
    e
  • 对象的属性:
    e.b
  • 集合中的属性:
    e[key]
  • 函数的返回值:
    e()
为了再次检查,由于您的构造过去在“old JSLint”(旧JSLint)中工作,我问了Douglas Crockford。他很简洁,但是

对不起,我帮不上忙了。我认为在某些地方,
(someExpression).someMethod()
是权宜之计,但也要理解JSLint的来源。如果您想进行类型强制,请显式强制


有趣的问题;谢谢您的提问。

我看不出您的原始代码有任何问题。对那个表达式调用
toFixed()
,我觉得很好。顺便说一句,您可能希望在函数赋值后添加冒号。我强烈建议您找到JSLint的替代品,这是关于完全有效JavaScript的愚蠢规则警告。考虑EsLink,JSC,甚至JSHITIT.@ Nayuki是的,它在我的代码中。我刚打了一个快速演示,这是我愚蠢的疏忽。如果我有其他理由对我的问题进行编辑,我会补充这一点。谢谢@AlexanderO'Mara这两个有Visual Studio插件吗?这就是我们进行分析的方式。我通常只是将代码粘贴到jslint.com中,在一千行代码中最多收到一到两条警告。我现在在一家客户公司接受任务,他们要求我安装这个插件。如果有更好的选择,我一定会提出建议。@AlexanderO'Mara天哪。很抱歉在这个问题上向你发泄,但如果这是一个JSLint问题,请给出一个JSLint答案。我不会用“你真的应该拿出你对JavaScript的所有意见,并使用一个有强烈意见的linter来更普遍地标准化你的代码库”来回答ESLint&JSHint问题。评论“你的工具臭0rz”就像说,“停止使用JavaScript.VBScript rulez!1!”这只是意见而已。克罗克福德的错误很少被证明;通常,发表这些评论的人不会花时间去理解他推荐的内容或原因。你有很多帮助。他从哪里来确实很有道理。这是其中一种情况,作为一个人,我们知道它不适用,但是当你编写一个程序来做一些一般性的事情时,你不能保证它总是这样,所以要谨慎行事。
/*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
};
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;
}