24

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

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

产生的错误是:

“期待一个赋值或函数调用,但看到了一个表达式。”

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

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

但是,我并没有真正看到第一个示例的问题。三元运算符真的只能用于赋值吗?

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

任何人?

4

1 回答 1

35

这是一种表达。相当于写

0 === 1;

您正在编写一个具有直接副作用并且被认为是不好的表达式。

通常,表达式是没有副作用的无用语句。简单地做被认为是更好的形式

if (s === "test") {
  MyFunc();
} else {
  MyFunc2();
}

除此之外,它的语法非常可靠。我个人确实同意写一个简洁的三元组来代替 anif是不好的,你最好只将它用于分配。

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

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

同样,如果仅用作表达式,则这些被认为是不好的形式,因为使用它们只会使逻辑变得模糊并使代码更难维护。

JSHint对此有一个选项expr。见

跑步:

/*jshint
  expr: true
*/

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

将通过

于 2011-06-06T07:31:22.553 回答