Как работают бинарные логические операторы && и || в JavaScript?
Вот краткий пересказ своими словами из спецификации ECMAScript 2020 о том, как работают логические операторы.
ToBoolean ( аргумент ) Абстрактная операция ToBoolean принимает аргумент. Она преобразует аргумент в значение типа Boolean согласно следующей таблице: Код:
┌───────────────┬──────────────────────────────────────────────┐
Когда вычисляется A || B, то происходит следующее...
|
Когда вычисляется A || B, то происходит следующее...
Если ToBoolean( A ) возвращает true, то вернуть A иначе вернуть B console.log((a || c)) //undefined Если результат 'с' которое undefined - false какого он возвращает undefined Согласно вашей же табличке результат вычисления 'c' в булевом выражении - false и общий результат должен быть false, а не undefined |
Цитата:
var a=false var b=true var c=undefined console.log((a || c)) //undefined console.log((b || c))//true Я так понимаю (судя по коду выше), a || c у вас означает false || undefined . Смотрим... Когда вычисляется A || B, то происходит следующее...
Подстанавливаем ваше выражение, получается... Когда вычисляется (A = false) || (B = undefined), то происходит следующее...
|
Ну т.е. для булевых выражений работают правила, а не табличка, согласно которой если аргумент undefined ,то результат false
|
Я вот и хотел, чтобы объяснили эту тонкость, а для булевых значений я в курсе. Речь идет об интерпретаторе, когда тип аргументов еще не известен. Можно использовать и правила js для toBoolean, но я против таких абстракций. фактически незначение undefined приравнено к значению. Хотя по идее если от значения undefined зависит результат булевой операции нужно возвращать undefined. Понятно, что правила сделаны в угоду синтаксису. Но ...
|
Цитата:
Все операции выполняются так, как они записаны, с учетом лево или правосторонности. Операция + ни грамма не ассоциативная. 1+ "0" и "0" + 1 Операции && и || не булевы, а логические. Так они названы в спецификации. Булевые операции подразумевали бы, что их операнды должны иметь тип boolean и выдавать такой же результат. Цитата:
В JS есть тип undefined (такой же как Number, String, Boolean) с единственным значением undefined |
Цитата:
|
Цитата:
В спецификации нет такого понятия. |
|
mdn хорошая вещь.
Но это не спецификация, а только ее трактовка. Иногда не совсем полная. |
Часовой пояс GMT +3, время: 19:34. |