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

时间:2011-06-06 07:26:15

标签: javascript ternary-operator jslint jshint

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

s === "test" ? MyFunc() : MyFunc2();

产生的错误是:

  

“预期任务或职能   打电话,而是看到一个表达。“

显然,JSLint期待在这里进行一项任务,更像是:

var y = (s === "test") ? MyFunc() : MyFunc2();

但是,我并没有真正看到第一个例子的问题。是否真的应该将三元运算符用于分配?

我在JSLint.com上看不到任何内容,“JavaScript:好的部分”一书中也没有任何明显的内容。并且,社区分支JSHint中也报告了相同的错误。

任何?

1 个答案:

答案 0 :(得分:35)

这是一个表达。这相当于写作

0 === 1;

你正在编写一个具有直接副作用且被认为是坏的表达式。

通常,表达式是没有副作用的无用语句。简单地做

被认为是更好的形式
if (s === "test") {
  MyFunc();
} else {
  MyFunc2();
}

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

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

someCondition && doMagic(magic);
someCondition || doMagic(magic);

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

JSHint 为此选择expr。见ticket

运行:

/*jshint
  expr: true
*/

var s, MyFunc, MyFunc2;
s === "test" ? MyFunc() : MyFunc2();
0 === 1;

将通过