Javascript 为什么JSHint不喜欢对象上方法调用的ternaries?

Javascript 为什么JSHint不喜欢对象上方法调用的ternaries?,javascript,jshint,Javascript,Jshint,JSHint给出以下错误: 应为赋值或函数调用,而应为表达式 对于以下代码行: (aFunctionOrNull) ? aFunctionOrNull() : someObject.someMethod(); 它突出显示了someMethod上的最后一个),因此我假设错误就在那里。当我将JSHint改为if(){}else{}语法时,代码运行正常,JSHint没有问题。我不介意较长的语法,但我想了解为什么JSHint会这样说,以及这是否是一种糟糕的做法 最大的困惑可能来自术语。someObje

JSHint给出以下错误:

应为赋值或函数调用,而应为表达式

对于以下代码行:

(aFunctionOrNull) ? aFunctionOrNull() : someObject.someMethod();
它突出显示了
someMethod
上的最后一个
,因此我假设错误就在那里。当我将JSHint改为
if(){}else{}
语法时,代码运行正常,JSHint没有问题。我不介意较长的语法,但我想了解为什么JSHint会这样说,以及这是否是一种糟糕的做法


最大的困惑可能来自术语。
someObject.someMethod()
不是函数调用吗?

JSHint谈到表达式,或者
expr

此选项不显示有关在以下位置使用表达式的警告: 通常,您希望看到赋值或函数调用。最 在当时,这样的代码是一个打字错误。然而,这并不是政府所禁止的 这就是为什么这个警告是可选的

而JSLint说:

expression语句应为赋值语句或 函数/方法调用或删除。所有其他表达式语句都是 被认为是错误的

好了,做你正在做的事情没有问题,只是它会发出警告,因为它希望你使用一个
if..else
语句,但是你可以在JSHint中关闭它,方法是:

/*jshint expr:true */

这是因为三元数是一个表达式。您可以使用它设置一个变量:

var result = a ? b : c;
请注意,三元计算结果为
b
c
。这是一个表达

也就是说,这个警告(我相信)来自这样一个概念:ternaries的可读性比
if…else
块差。上面的代码可以重写

var result;
if (a) {
    result = b;
} else {
    result = c;
}

这比三元表更容易阅读。JSHint在提升可读代码方面所做的工作与提升有效代码一样多。如果您愿意在代码中包含这些表达式,请继续并禁用表达式警告。(这就是我要做的。)

一般来说,使用三元运算符调用函数而不指定返回值(这似乎是您正在做的)被认为是不好的做法。
此外,值得检查一下JSHint对以下代码的看法:

(aFunctionOrNull || someObject.someMethod)();
如果
affunctionornull
未定义(或null或falsy),逻辑or位将导致表达式计算为
someObject.someMethod
,并调用该表达式的结果值(希望是对函数对象的引用)。这使您有机会编写更“故障安全”的代码,而无需大量嵌套三元代码:

(aFunctionOrNull || someObject.someMethod || function(){})();
分组表达式现在被绑定为计算一个真实值,因此不会抛出任何错误。
为了避免JSHint唠叨您没有对返回值执行任何操作,可以将其分配给一个变量(我真的不喜欢这样做),或者在混合中添加一个小操作符:

~(aFunctionOrNull || someObject.someMethod || function(){})();//bitwise not
!(aFunctionOrNull || someObject.someMethod || function(){})();//logical not, doesn't really matter which one
关于最后一个问题:
someObject.someMethod
实际上是一个函数调用。更具体地说,它是对
someObject
上下文中的函数对象的调用
对于那些不知道这一点的人:JS函数是对象,调用的上下文要么使用
bind
方法(在
Function.prototype
上定义)显式设置,要么特别设置:

var referenceToMethod=someObject.someMethod;

参考方法()//谢谢你的回答!每种方法都为JS、JSHint和编码实践提供了有用的信息。JSHint适合于
(affunctionornull | | someObject.someMethod)()我认为,它比三元组读得更好,只是比
if(){}else{}
略难读。我不得不用Chai's expect在Mocha测试中这样做,因为有时候我需要做
expect(myVar).to.not.exist
哪个JSHint有问题,因为exist没有
()
s.在阅读了您解释三元组的帖子后,我尝试了以下JSHint没有问题的方法:
((affunctionornull)?affunctionornull:someObject.someMethod)()然而,这看起来比
if…else
块更清晰,JSHint也同意Elias的
(affunctionornull | someObject.someMethod)建议()为简洁起见。
var referenceToMethod = someObject.someMethod;
referenceToMethod();//<-- inside the function objects, this now points to the global object