JavaScript三元运算符和JSLint中的表达式

Jam*_*man 23 javascript jslint ternary-operator jshint

我最近收到了一篇关于JSLint的博客文章的评论,询问JSLint为什么会抛出以下错误:

s === "test" ? MyFunc() : MyFunc2();
Run Code Online (Sandbox Code Playgroud)

生成的错误是:

"期待一个任务或函数调用,而是看到一个表达式."

很明显,JSLint期待在这里进行任务,更像是:

var y = (s === "test") ? MyFunc() : MyFunc2();
Run Code Online (Sandbox Code Playgroud)

但是,我没有看到第一个例子的问题.是否真的应该将三元运算符用于指派?

我在JSLint.com上看不到任何东西,在JavaScript:The Good Parts一书中也没有任何明显的东西.并且,社区fork JSHint中也报告了相同的错误.

任何人?

Ray*_*nos 35

这是一种表达方式.这相当于写作

0 === 1;

你正在写一个具有直接副作用的表达,这被认为是不好的.

通常,表达式是没有副作用的无用语句.简单来说,它被认为是更好的形式

if (s === "test") {
  MyFunc();
} else {
  MyFunc2();
}
Run Code Online (Sandbox Code Playgroud)

除此之外,它的语法非常扎实.我个人同意,写一个简洁的三元作为一个替代if是坏的,你最好只用它来分配.

其他短手表达(ab)用于简洁

someCondition && doMagic(magic);
someCondition || doMagic(magic);
Run Code Online (Sandbox Code Playgroud)

如果只使用表达式,这些被认为是不好的形式,因为使用它们只会掩盖逻辑,并使维护代码变得更加困难.

JSHint有一个选项expr.看

运行:

/*jshint
  expr: true
*/

var s, MyFunc, MyFunc2;
s === "test" ? MyFunc() : MyFunc2();
0 === 1;
Run Code Online (Sandbox Code Playgroud)

将传递