В чем разница между использованием '&&' и '||' через троичный оператор ('?' и ':')? - PullRequest
0 голосов
/ 27 июня 2018

В JavaScript, в чем разница между

true ? 'Hello' : 'Goodbye' //Evaluates to "Hello"

false ? 'Hello' : 'Goodbye' //Evaluates to "Goodbye"

и

true && 'Hello' || 'Goodbye' //Evaluates to "Hello"

false && 'Hello' || 'Goodbye' //Evaluates to "Goodbye"

Ответы [ 4 ]

0 голосов
/ 27 июня 2018

Кажется, что нет разницы в результате. НО у меня была догадка о том, как они обрабатываются. ()?: на самом деле чуть-чуть быстрее, чем &&|| (см. Демонстрацию ниже).

(A)B?C: в основном является сокращением IF, поэтому часть (A) оценивается и выбирается либо стек B then, либо C else.

(A)&&B||C оценивается полностью. Сначала оценивается (A). После этого происходит неявное неявное преобразование (логическое преобразование) , что занимает немного времени

var max = 1e7;

var start1 = (new Date()).getTime();
for( var i = 0; i < max; i++) {
  let a = (i%2) ? max-i : max+1;
  let b = (i%3) ? max-i : max+i;
}
var stop1 = (new Date()).getTime();

var start2 = (new Date()).getTime();
for( var i = 0; i < max; i++) {
  let a = (i%2) && max-i || max+i;
  let b = (i%3) && max-i || max+i;
}
var stop2 = (new Date()).getTime();

console.log( (new Date()).getTime() );

console.log( stop1 -start1 );
console.log( stop2 -start2 );
0 голосов
/ 27 июня 2018

Тернарный оператор

Это короткая рука if else.

true ? 'Hello' : 'Goodbye'

эквивалентно

if (true) {
    'Hello'
} else {
    'Goodbye'
}

Логические предикаты

, тогда как true && 'Hello' || 'Goodbye' не является if else условием

true && 'Hello' || 'Goodbye'

эквивалентно

(true && 'Hello') || 'Goodbye'

Это приводит к Hello, но основано на приоритете. Рассмотрим случай

'Goodbye' || (true && 'Hello')

Это приведет к Goodbye. Изменение порядка приводит к изменению вывода, но этого не происходит с троичным оператором.

0 голосов
/ 27 июня 2018

Это две разные концепции, которые дают вам один и тот же ответ.


В первом примере используются троичные операторы и , его результат зависит только от от первого операнда (в вашем примере 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'

Из-за того, как работает ||, происходит вывод того, что выводит ваш первый пример, но это разные концепции.

Обратите внимание, что в первом примере мы знаем, что возвращать после вычисления первого операнда. Во втором примере мы должны оценить первые два операнда, прежде чем мы знаем, что возвращать.

0 голосов
/ 27 июня 2018

Ваш первый случай - пример встроенных операторов if, а второй - пример логических предикатов.

...