Если верно … иначе Сокращенная запись

Я знаю, что обычный вариант использования этого оператора if, например.

var string = boolean ? "this" : "that";

Я использую jhint в своем редакторе, и когда я пытаюсь что-то вроде

boolean ? array.push("this") : array.slice("that",1);

jshint throws (W030) «Ожидается назначение или вызов функции, а вместо этого отображается выражение»

До сих пор код всегда работал нормально, но, возможно, мне просто повезло.

Итак, мой вопрос: почему я не должен использовать этот шаблон и что может быть альтернативой? Потому что писать

if(boolean){
    array.push("this");
} else {
    array.splice("that",1);
}

от таких коротких инструкций у меня просто мурашки по коже.

Спасибо.


person user3144851    schedule 23.08.2014    source источник
comment
JSLint жалуется на это из соображений удобочитаемости. Какой из двух вы считаете более читабельным? Код читается намного больше, чем пишется. Это не должно вызывать у вас мурашки по коже, чтобы написать еще одну строчку.   -  person Benjamin Gruenbaum    schedule 23.08.2014
comment
Добавьте /*jshint -W030 */ в начало файла, чтобы удалить предупреждение, или обновите файл .jshint.   -  person Miguel Mota    schedule 23.08.2014
comment
array.push изменяет массив, а array.slice нет. Часть после : не действует, зачем вы ее использовали?   -  person Salman A    schedule 23.08.2014


Ответы (5)


Тернарный оператор можно обернуть внутри void operator вот так:

void(cond ? expr1 : expr2);

Это достигает желаемого результата и передает JSHint. См. JSFiddle и нажмите кнопку JSHint.

Однако я рекомендую следующий синтаксис:

if (cond) {
    expr1;
} else {
    expr2;
}

Потому что это более читабельно. Просто потому, что JavaScript позволяет вам делать странные вещи, не означает, что вы должны это делать.

person Salman A    schedule 23.08.2014

Он жалуется на то, что вы незаконно присвоили условный оператор. Это оператор, а не управляющая структура. Так что он живет в категории таких вещей, как +,-,*,/. Это означает, что вы ожидаете, что первый операнд будет логическим, а второй и третий дадут возвращаемое значение.

Все это должно быть коротким для

  if (boolean) {
   string ="this" ;
  } else {
   string ="that";
  }

Он хочет вернуть значение (чего он не может сделать в вашем случае) и ожидает, что вы будете использовать это значение (чего вы не делаете). Таким образом, тенарий if не подходит для вашего случая и, как следствие, делает его гораздо менее читаемым.

person Trudbert    schedule 23.08.2014

Вы используете побочные эффекты в выражениях для выполнения логики.

Действительно не очень дружественный код. Это будет работать.

Просто перепишите, чтобы отделить логику от выражений.

person Pieter21    schedule 23.08.2014

Вы можете обойти сообщение jshint, используя:

void(boolean ? array.push("this") : array.slice("that",1));
person KooiInc    schedule 23.08.2014

Если вы действительно хотите использовать тернарный оператор для такого рода операций чистым способом, вы можете сделать это следующим образом:

array[cond ? 'push' : 'slice'](cond ? "this" : "that", cond ? 1 : undefined);

or

array[cond ? 'push' : 'slice'].apply(null, cond ? ["this"] : ["that", 1]);

Но в любом случае вы можете предпочесть скучный оператор if.

person YMMD    schedule 23.08.2014