Булевы операторы, которые возвращают один из операндов - PullRequest
2 голосов
/ 12 июля 2010

В Python и, возможно, в Javascript логические операторы or и and возвращают один из операндов вместо true или false.

  • В Python возвращается один из операндов: '' || 'hello' == 'hello'
  • Для сравнения, в PHP: '' || 'hello' == true;

Теперь

  • Как называется это поведение булевых операторов?
  • Это также работает в Javascript во всех браузерах?

Ответы [ 3 ]

2 голосов
/ 12 июля 2010

Как указывает Игнасио , это объединяющиеся операторы.|| является оператором объединения нулей , && является оператором нулевых операций объединения ( ссылка для перехода, если я могу найти один извините, я не могу найти ссылку).

Они должны быть доступны во всех браузерах - оба они определены в 1-м, 2-м, 3-м и 5-м изданиях ECMA-262, большинство современных реализаций Javascript основаны на 3-м или 5-м.Из ECMA-262, 3-е издание:

Производство LogicalANDExpression: LogicalANDExpression && BitwiseORExpression оценивается следующим образом:
1. Оценить LogicalANDExpression.
2. Вызвать GetValue (Result (1)).
3. Call ToBoolean (Result (2)).
4. Если Result (3) равен false, вернуть Result (2).
5. Оценить BitwiseORExpression.
6. Вызвать GetValue (Result(5)).
7. Вернуть результат (6).

Продукция LogicalORExpression: LogicalORExpression ||LogicalANDExpression оценивается следующим образом:
1. Оценить LogicalORExpression.
2. Вызвать GetValue (Result (1)).
3. Вызвать ToBoolean (Result (2)).
4. If Result (3) true, вернуть Result (2).
5. Оценить LogicalANDExpression.
6. Вызвать GetValue (Result (5)).
7. Вернуть Result (6).

1 голос
/ 12 июля 2010

Это называется "объединением". Он должен вести себя одинаково в любом браузере, который заявляет о совместимости.

0 голосов
/ 05 июня 2019

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 будет всегда выполняться.

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

...