A недавний вопрос был переадресован здесь, и хотя я согласен с тем, что на центральный вопрос был дан точный ответ на высоком уровне, часть нового вопроса, похоже, задает вопрос о разнице между логическимИЛИ и троичный оператор в Javascript.
Я хотел бы предложить низкоуровневый пример, чтобы продемонстрировать разницу, потому что большую часть этого я написал до того, как вопрос был перенаправлен, и концепция null-coalescing operator
довольноаннотация.
Рассмотрим следующие функции, которые можно запустить в консоли браузера или в любом другом реплее:
let logicalOrTest = function(val) {
let a = 2;
let b = 3;
console.log(val === a);
console.log(val === b);
console.log(val === (a || b));
console.log(val !== (a || b));
}
Ожидаем logicalOrTest(2)
в лог true false true false
Ожидаем logicalOrTest(3)
для записи false true false true
Ожидается logicalOrTest(4)
для записи false false false true
Это показывает, что сравнение любого значения val
с (a || b)
вернет true
, когда значениеэквивалентно первому условию и false
для любого другого значения, , включая второе.
Проще говоря, если выполняется условие a
, условие b
не выполняетсядаже считается.С другой стороны, если условие a
не выполнено, b
будет считаться , прежде чем определять, что делать.
Теперь давайте посмотрим на троичный оператор:
let ternaryTest = function(val) {
let a = 2;
let b = 3;
val === a ? console.log(true) : console.log(false);
val === b ? console.log(true) : console.log(false);
val === (a || b) ? console.log(true) : console.log(false);
val !== (a || b) ? console.log('neither condition was met') : console.log('wat');
}
Ожидается ternaryTest(2)
в лог true false true "wat"
Ожидается ternaryTest(3)
в лог false true false "neither condition was met"
Ожидается ternaryTest(4)
в лог false false false "neither condition was met"
Как и логическое ИЛИ (||
), троичный оператор x ? x : y
передает любое значение falsy в область действия второго выражения, которое также включает значения, эквивалентные второму условию.Если условие a
выполнено, условие b
не учитывается.
Разница составляет , что если условие a
равно , а не выполнено в троичной операции, выражение a
будет игнорироваться, а выражение b
будет всегда выполняться.
Таким образом, хотя они могут использоваться для аналогичных целей, важно понять, какой из них более эффективен- особенно если вы запускаете большие блоки кода в рамках вашей операции.