Безопасно ли запускать код внутри условного оператора? - PullRequest
4 голосов
/ 06 января 2012

Я часто вижу и использую такие коды, как:

var myvar = (1 < 2) ? 3 : 4 ; //if 1 < 2 then myvar = 3, else = 4

Но я недавно видел код, который выполнял код, как некая замена для if(){}else{}:

Пример:

(1 < 2) ? alert("example1") : alert("example2");

Первые мысли, которые пришли ко мне, были: «Вау, это примерно на 6-7 символов короче», «Бесконечные возможности» или «Это сделало мой день".

Мой вопрос:

  • Является ли эта вещь безошибочной и безопасной для использования?(например, с большим количеством кода внутри и вложенными вещами)

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

Ответы [ 4 ]

7 голосов
/ 06 января 2012

Является ли эта вещь безошибочной и безопасной для использования? (например, с большим количеством кода внутри и вложенные вещи)

Да. Однако чем больше кода внутри него, тем менее читабельным он становится.

Я предпочитаю использовать его (условный оператор) для кратких, кратких утверждений. Все, что сложнее, заслуживает if/else ради удобочитаемости и удобства обслуживания.

4 голосов
/ 06 января 2012

Есть несколько исключений.Вы не можете сделать это с:

  • break
  • continue
  • Любой блок, как if, for, while,do или try

например.Более того, это может испортить ваш порядок действий:

x < 3 ? l = true : r = true; // Syntax error, = has lower precedence than ?:

Но это не причина не делать этого, а потому, что это некрасиво.Какой из них вам понятнее:

if(i > 5) {
    alert('One');
} else {
    alert('Two');
}

или

i > 5 ? alert('One') : alert('Two');

?Это не совсем верно, не так ли?И спасение персонажей никогда не является причиной, чтобы что-то делать;в противном случае не было бы комментариев или пробелов.Хороший минификатор, такой как Google Closure Compiler, автоматически преобразует их для вас, когда это возможно, и есть множество других мест для сохранения.В конце концов, это именно то, что вы считаете наиболее удобным и читабельным.

Кроме того, если вам в конечном итоге понадобится break, continue и т. Д., То это будет довольно непоследовательный и непривлекательный код.

2 голосов
/ 06 января 2012

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

var phone = old ? "blackberry" : "iPhone"

Это намного проще, чем с помощью if:

var phone = "iphone"
if (old) {
    phone = "blackberry"
}

Это хорошо в этом контексте, в примере, который вы описали, и как только это начнет сбивать с толку, или я определенно не рекомендую это!

Ваш пример мог бы быть лучше, как это:

var msg = 1 < 2 ? "alert1" : "alert2";
alert(msg);
1 голос
/ 06 января 2012

Вы также можете написать:

alert( 1<2? "example1" : "example2" );

Тернарный оператор предназначен для простых случаев, иногда разработчики увлекаются и используют его для замены нескольких операторов if..else, например,

var someVal = foo < bar? 'yes' : bar > fum? : fum : fi != fee? fi : fee;

что не очень хорошая идея ИМХО.

...