Подтвердить что ты не робот

Выражения в JavaScript Тернарный оператор и JSLint

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

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

Созданная ошибка:

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

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

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

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

Я ничего не мог увидеть на JSLint.com, и в книге не было ничего очевидного. JavaScript: Хорошие детали. И такая же ошибка также сообщается в fork JSHint.

Кто-нибудь?

4b9b3361

Ответ 1

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

0 === 1;

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

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

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

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

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

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

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

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

Продолжительность:

/*jshint
  expr: true
*/

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

Пройдет