true || undefined // true
Поясните пожалуйста почему?
var a=false var b=true var c=undefined console.log((a || c)) //undefined console.log((b || c))//true |
|
Это приводит к
console.log((a || c)!=(c || a)) //true |
Цитата:
|
Цитата:
а в случае console.log((a || c)) // внезапно undefined даже не false! Это просто фича такая:) |
Я к чему это написал, что правильнее было бы сделать оба выражения учитывающих только операнды со значением , либо если один из операндов undefined, то и всё выражение тоже undefined
|
Цитата:
Правильно придерживаться спецификации языка где операции над операндами совершаются согласно описанию а приоритет операций согласно таблице приоритетов. То что ты считаешь правильным поломает логику работы языка и приведет к различному поведению в различных ситуациях. |
Нельзя поломать то, что уже поломано. И именно в булевых выражениях.
1+ undefined и undefined+1 даст одно и то же NaN. С точки зрения логики ассоциативность в языке не должна влиять на результат булевых выражений . Так что не чушь. |
Ну так и используй плюс.
У логического или другой алгоритм работы. Именно по этому плюс и возвращает NaN А логическое "или" первое истинное значение из операндов. |
Цитата:
|
Как работают бинарные логические операторы && и || в 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 хорошая вещь.
Но это не спецификация, а только ее трактовка. Иногда не совсем полная. |
Цитата:
|
Цитата:
Цитата:
alert(("a" + "b") + "c" === "a" + ("b" + "c")); // true, поскольку ассоциативность выполняется alert((1 + 2) + 3 === 1 + (2 + 3)); // true, поскольку ассоциативность выполняется alert((1 + 1) + "1" === 1 + (1 + "1")); // false, вы конечно можете и тут подобрать true, но тут разные типы, это плохая практика — отстреливать себе ноги и играть с мухой без головы, понапихают разного рандомного говна в операнды, а потом сидят и задают тупые вопросы, типа а почему там нет ассоциативности! Цитата:
|
Цитата:
|
Цитата:
Цитата:
В нем ничего не говорится, что если типы одинаковы, то есть ассоциативность, а если разные то ассоциативности нет... Просто есть алгоритм, как выполняется операция с учетом возможных типов |
Цитата:
Но про ассоциативность в программировании просто говорить бессмысленно. Так же, как и про коммутативность. a+(b+c) == (a+b)+c ? a+b == b+a ? Когда как. Мы же не знаем, что такое а, b, c. А может быть это вызовы функций с побочным эффектом? Просто есть правила выполнения операций. a * b Вычисли а, приведи к числовому типу Вычисли b, приведи к числовому типу (именно в такой последовательности, а не наоборот) Результаты арифметически перемножь |
Цитата:
|
Malleys всё чётко объяснил, зачем это мозгоблудие? И приоритет есть для операндов и ассоциативность. Все дело именно в применение toBoolean. для js оно такое. Возможно что-то похожее есть и в др. языках. Давайте закруглять тему.
|
Часовой пояс GMT +3, время: 00:01. |