2011-06-06 32 views
23

我最近收到的评论有关的JSLint问我的博客文章之一,为什么JSLint的扔了一个错误有以下:产生表达式在JavaScript三元运算符和JSLint的

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

错误是:

”预计分配或功能 调用,而是看到一个表达式。“

很明显的JSLint在这里期待的分配,财产以后更像是:

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

但是,我实在不明白的问题,第一个例子。三元运营商是否只能用于任务是真的吗?

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

有人吗?

回答

34

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

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; 

将通过

+1

+1从强大的Raynos答案。我必须承认,我有时使用速记表达而不是“if”陈述。虽然很少三元,通常就像'match && doSomethingWith(match)'。但是那只是因为我很懒:P一般来说,我认为JSLint抱怨说当个人偏好发挥作用时你可以忽略一些事情。 – 2011-06-06 07:43:36

+1

@Andy E:我意识到JSLint中有部分个人喜好会发挥作用,但有兴趣看到JSHint也重复了同样的信息。尽管如此,知道总是很好的。 – 2011-06-06 07:50:32

+1

@JamesWiseman JSHint允许你定制一个_lot_。有一个'expr'选项可以禁止这些警告。在我看来,简单的'||','&&'或'?'可以使用,但我可以明白为什么它们可能会变坏。 – Raynos 2011-06-06 08:08:45