Сокращенное выражение if/else: foo? Foo:bar vs foo || бар
Интересно, как эти два отличаются?
var hello = foo?foo:bar;
против
var hello = foo || bar;
Вы можете это объяснить? а какой пример дела? или оба одинаковы?
PS: foo / bar должен быть похож на string / int / obj / boolean...
1 ответ
? :
называется условным оператором. Он принимает три аргумента (именно поэтому его иногда называют "троичным" оператором): что-то для проверки, что-то для возврата, если проверка верна, и что-то для возврата, если проверка ложна. *
Второй - это необычайно мощный логический оператор ИЛИ в JavaScript. Он принимает два аргумента. Он оценивает первый операнд и, если это правда, возвращает его; если первый - false, он оценивает и возвращает второй операнд.
Таким образом, разница между этими двумя заключается в следующем: с условным оператором, foo
может оцениваться дважды (если это правда). С ||
, foo
оценивается только один раз. Это действительно не имеет значения, если foo
а также bar
это просто ссылки на переменные, но рассмотрим:
var hello = foo() ? foo() : bar();
// vs
var hello = foo() || bar();
Вы можете увидеть, как это важно, сколько раз foo()
оценивается, если он выполняет какую-либо значительную работу или имеет какие-либо побочные эффекты.
(* Так что же представляют собой значения "правдивый" и "ложный"? 0
, ""
, NaN
, undefined
, null
и конечно false
, Все остальное "правдиво".)