#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.
Не могли бы вы пояснить это утверждение? Каковы непосредственные побочные эффекты ? Тем не менее, хороший ответ!