意外的“。”从包装表达式到链
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 的来源。如果您有可能进行类型强制,请显式强制。
有趣的问题;谢谢提问。
我有这个计算总数的方法,其中一部分是在 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 的来源。如果您有可能进行类型强制,请显式强制。
有趣的问题;谢谢提问。