Javascript 意外'';从包装表达式到链
我有一个计算总数的方法,其中一部分是在JS Lint中给出警告。我们试图在工作中进行更清洁的JS皮棉检查,所以我想看看是否有一种合理的方法来解决这个问题,而我并没有想到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) &&
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()
(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;
}