Тернарный оператор и, если A, B, еще C. Есть ли важные различия? - PullRequest
0 голосов
/ 24 марта 2009

Есть несколько способов сделать это в javascript.

Вероятнее всего, наиболее читаемым и гибким является:

if (a){
    //b
}
else {
    //c
}

Что-то еще, что * работает только с присваиванием и менее читабельно:

var foo = 'c';
if (a){
    foo = 'b';
}

Мой главный вопрос, однако, о двух последних методах, которые я могу придумать:

var foo = a ? b : c;

var foo = a && b || c;

Есть ли различия между этими двумя выражениями? Кроме читабельности, которой не хватает обоим.

* хотя вы могли бы назначить функцию foo функцией, а затем выполнить ее после оператора if.

Ответы [ 4 ]

8 голосов
/ 24 марта 2009

Предположим:

var a = false, b = '', c = 'bar';

Тогда:

var foo = a ? b : c; // foo == ''
var foo = a && b || c; // foo == 'bar'

Два не эквивалентны; Вы никогда не должны использовать логические операторы вместо условного оператора. Как и другие ответчики, я также придерживаюсь мнения, что условный оператор не лишен читабельности простых выражений.

5 голосов
/ 24 марта 2009

Тернарный оператор, безусловно, читается для меня. Даже больше, чем в первом примере, поскольку лаконичный, логический код всегда легче понять, чем множество строк управляющего кода, которые делают то же самое.

3 голосов
/ 24 марта 2009

Я не согласен с тем, что первое не читаемо, если оно используется правильно, IOW a, b и c сами являются простыми выражениями. Этот оператор подвергается насилию, хотя в определенных обстоятельствах он не должен.

Точно так же второе выражение, использующее результат foo как что-либо кроме логического, не будет хорошо. Использование логических операторов для возврата не булевых значений, потому что так они работают, просто сбивает с толку. Однако в качестве логического выражения это разумно.

1 голос
/ 24 марта 2009
var foo = a ? b : c;    // foo is b when a is true else c.
var foo = a && b || c;  // foo is true if a and b are true or c is true.

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

...