Выражения в JavaScript Ternary Operator и JSLint - PullRequest
23 голосов
/ 06 июня 2011

Недавно я получил комментарий к одному из своих постов в блоге о JSLint с вопросом, почему JSLint выдал ошибку со следующим:

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

Сгенерирована ошибка:

"Ожидал назначения или вызова функции и вместо этого увидел выражение. "

Очевидно, что JSLint ожидает здесь назначения, что-то вроде:

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

Но я не совсемувидеть проблему с первым примером.Действительно ли так, что троичные операторы должны использоваться только для присваиваний?

Я ничего не видел на JSLint.com , и в книге не было ничего очевидного JavaScript: The GoodЧасти.И такая же ошибка также сообщается в сообществе fork JSHint .

Anyone?

1 Ответ

35 голосов
/ 06 июня 2011

Это выражение.Это эквивалентно написанию

0 === 1;

Вы пишете выражение, которое имеет непосредственные побочные эффекты и которое считается плохим.

Обычно выражения являются бесполезными утверждениями, которые не имеют стороннихэффект.Лучше всего просто набрать

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

Кроме того, это совершенно твердый синтаксис.Я лично согласен с тем, что написание краткого троичного в качестве альтернативы if - это плохо, и вам лучше использовать его только для присваивания.

Другое короткое выражение, которое (ab) использовалось для краткого-ness

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

Опять же, они считаются дурным тоном, если их использовать только как выражения, потому что их использование просто скрывает логику и усложняет поддержку кода.

JSHint имеет опцию expr для этого.См билет

Бег:

/*jshint
  expr: true
*/

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

Пройдет

...