Это две разные концепции, которые дают вам один и тот же ответ.
В первом примере используются троичные операторы и , его результат зависит только от от первого операнда (в вашем примере true
/ false
):
true ? 'Hello' : 'Goodbye' //Evaluates to "Hello"
false ? 'Hello' : 'Goodbye' //Evaluates to "Goodbye"
Это сокращенная форма if
/ else
. Если первый операнд верен, верните второй операнд (Hello
). Если первый операнд неверен, верните третий операнд (Goodbye
).
Первое выражение вашего первого примера можно переписать так:
if (true)
return 'Hello';
else
return 'Goodbye';
Во втором примере используются логические операторы и , его результат зависит от и первого и второго операнда .
true && 'Hello' || 'Goodbye' //Evaluates to "Hello"
false && 'Hello' || 'Goodbye' //Evaluates to "Goodbye"
Если firstOperand && secondOperand
соответствует истинному значению, вернуть secondOperand
. Если они оценят что-то ложное, верните thirdOperand
(Goodbye
).
В ваших примерах, поскольку непустая строка является достоверной, true && 'Hello'
оценивается как Hello
, а false && 'Hello'
оценивается как false
.
Итак, ваш второй пример превращается в:
'Hello' || 'Goodbye'
false || 'Goodbye'
Из-за того, как работает ||
, происходит вывод того, что выводит ваш первый пример, но это разные концепции.
Обратите внимание, что в первом примере мы знаем, что возвращать после вычисления первого операнда. Во втором примере мы должны оценить первые два операнда, прежде чем мы знаем, что возвращать.