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

#javascript #ternary-operator #jslint #jshint

#javascript #тернарный оператор #jslint #jshint

Вопрос:

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

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

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

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

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

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

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

Я ничего не смог увидеть на JSLint.com также не было ничего очевидного в книге JavaScript: The Good Parts. И о той же ошибке также сообщается в форке сообщества JSHint.

Кто-нибудь?

Ответ №1:

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

0 === 1;

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

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

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

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

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

 someCondition amp;amp; doMagic(magic);
someCondition || doMagic(magic);
  

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

У JSHint есть опция expr для этого. Смотрите тикет

Выполняется:

 /*jshint
  expr: true
*/

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

Пройдет

Комментарии:

1. 1 за ответ от могущественного Raynos. Должен признать, я иногда использую сокращенные выражения, а не if инструкции. Хотя и редко тернарный, обычно что-то вроде match amp;amp; doSomethingWith(match) . Но это только потому, что я ленивый : P В общем, я действительно думаю, что есть пара вещей, на которые жалуется JSLint, которые вы можете игнорировать, когда в игру вступают личные предпочтения.

2. @Andy E: Я понимаю, что есть части JSLint, в которых играют роль личные предпочтения, но было интересно увидеть то же сообщение, перепечатанное JSHint. Однако всегда полезно знать.

3. @JamesWiseman JSHint позволяет много настроек. Есть expr возможность подавить эти предупреждения. На мой взгляд, простые || , amp;amp; или ? хороши в использовании, но я могу понять, почему они могут быть плохими.

4. Есть ли сейчас? Интересно. Спасибо за ваш ответ 🙂

5. @Raynos: Your writing an expression that has immediate side effects and thats considered bad. Не могли бы вы пояснить это утверждение? Каковы непосредственные побочные эффекты ? Тем не менее, хороший ответ!