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

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

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

Возникла ошибка:

«Ожидали присваивание или вызов функции, а вместо этого увидели выражение».

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

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

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

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

Любой?


person James Wiseman    schedule 06.06.2011    source источник


Ответы (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;

Пройдешь

person Raynos    schedule 06.06.2011
comment
+1 за ответ от могучего Райноса. Должен признаться, что иногда я использую сокращенные выражения, а не операторы if. Однако редко тройной, обычно что-то вроде match && doSomethingWith(match). Но это только потому, что я ленивый :P В общем, я думаю, что JSLint жалуется на несколько вещей, которые вы можете игнорировать, когда в игру вступают личные предпочтения. - person Andy E; 06.06.2011
comment
@Andy E: Я понимаю, что есть части JSLint, где личные предпочтения действительно играют роль, но мне было интересно увидеть то же самое сообщение, представленное JSHint. Однако всегда полезно знать. - person James Wiseman; 06.06.2011
comment
@JamesWiseman JSHint позволяет вам множество настроек. Есть опция expr для подавления этих предупреждений. На мой взгляд, простые ||, && или ? подходят для использования, но я понимаю, почему они могут быть плохими. - person Raynos; 06.06.2011
comment
Есть сейчас? Интересно. Спасибо за ваш ответ :-) - person James Wiseman; 06.06.2011
comment
@Raynos: Your writing an expression that has immediate side effects and thats considered bad. Не могли бы вы пояснить это утверждение? Что такое немедленный побочный эффект? Тем не менее, хороший ответ! - person kumarharsh; 27.12.2013