что вернет логические операторы 0 undefined 10 foo
Логические операторы, как правило, используются с булевым типом данных и возвращают логическое значение (истина или ложь).
Как правило. на самом деле эти операторы и называются «логическими», но в JavaScript могут оперировать значениями любого типа и возвращать также значения любого типа.
С логическим И на первый взгляд всё просто, если оба операнда истины, то выражение истинно:
Этот пример можно немного усложнить и записать операндами выражения сравнения.
Но на самом деле всё не так просто. В данном примере мы использовали операторы сравнения, они возвращают логические значения true / false. Но операндами логического И могут быть выражения с арифметическими операторами.
Давайте изменим пример:
В этом примере оператор && вернёт 11. Дело в том, что на самом деле оператор && возвращает последний операнд, если все операнды истинны.
Если хоть один из операндов равен лжи, то && возвратит первый операнд со значением ложь.
В этом примере оператор && вернёт цифру 0. Можно, для более глубокого понимания, усложнить пример.
Что есть ложь в JavaScript
Сейчас хороший повод повторить что есть ложь в JavaScript.
Всё остальное в логическом контексте будет истиной.
Оператор логического ИЛИ возвращает первое значение true (истина). А если истинных значений нет, то последнее ложное.
Также становится очевидно, при помощи двойного логического НЕ мы можем преобразовать литерал в тип Boolean.
Короткий цикл вычислений
Оператор || (ИЛИ)
Переменная result будет равна «Привет!». Постфиксный инкремент myVar++ сработает после вычисления выражения, а префиксный инкремент ++myVar не будет выполнен, так как ранее оператор || обнаружит истину.
Оператор && (И)
Вычисления слево направо, если аргумент — false, оператор && возвращает его и заканчивает вычисления. Иначе — вычисляет дальше, если false в списке нет, возвращает последний правый аргумент, а он будет true.
Вычисления остановятся на переменной myStr, именно её значение «» и будет присвоено в переменную result.
&& вместо if
В простых случаях можно использовать оператор && вместо инструкции if:
В этом примере правый операнд выполнится только в том случае, если левый имеет логический тип истина.
Такая запись плохо читаема, рекомендуется использовать конструкцию JavaScript: if и else.
Логические операторы
Несмотря на своё название, данные операторы могут применяться к значениям любых типов. Полученные результаты также могут иметь различный тип.
Давайте рассмотрим их подробнее.
Оператор «ИЛИ» выглядит как двойной символ вертикальной черты:
В JavaScript, как мы увидим далее, этот оператор работает несколько иным образом. Но давайте сперва посмотрим, что происходит с булевыми значениями.
Существует всего четыре возможные логические комбинации:
Если значение не логического типа, то оно к нему приводится в целях вычислений.
Обычно оператор || используется в if для проверки истинности любого из заданных условий.
Можно передать и больше условий:
ИЛИ «||» находит первое истинное значение
Описанная выше логика соответствует традиционной. Теперь давайте поработаем с «дополнительными» возможностями JavaScript.
Расширенный алгоритм работает следующим образом.
При выполнении ИЛИ || с несколькими значениями:
Оператор || выполняет следующие действия:
Значение возвращается в исходном виде, без преобразования.
Другими словами, цепочка ИЛИ «||» возвращает первое истинное значение или последнее, если такое значение не найдено.
Это делает возможным более интересное применение оператора по сравнению с «чистым, традиционным, только булевым ИЛИ».
Получение первого истинного значения из списка переменных или выражений.
Сокращённое вычисление.
Операндами могут быть как отдельные значения, так и произвольные выражения. ИЛИ вычисляет их слева направо. Вычисление останавливается при достижении первого истинного значения. Этот процесс называется «сокращённым вычислением», поскольку второй операнд вычисляется только в том случае, если первого недостаточно для вычисления всего выражения.
Это хорошо заметно, когда выражение, указанное в качестве второго аргумента, имеет побочный эффект, например, изменение переменной.
В приведённом ниже примере x не изменяется:
Присваивание – лишь один пример. Конечно, могут быть и другие побочные эффекты, которые не проявятся, если вычисление до них не дойдёт.
Как мы видим, этот вариант использования || является «аналогом if «. Первый операнд преобразуется в логический. Если он оказывается ложным, начинается вычисление второго.
Оператор И пишется как два амперсанда && :
Эта статья посвящена особенностям работы механизмов приведения типов в JavaScript. Начнём мы её со списка выражений, результаты вычисления которых могут выглядеть совершенно неожиданными. Вы можете испытать себя, попытавшись найти значения этих выражений, не подглядывая в конец статьи, где будет приведён их разбор.
Проверь себя
Вот список интересных выражений, о которых мы только что говорили:
Тут полно такого, что выглядит более чем странно, но без проблем работает в JS, задействуя неявное приведение типов. В подавляющем большинстве случаев неявного приведения типов в JS лучше всего избегать. Рассматривайте этот список как упражнение для проверки ваших знаний о том, как работает приведение типов в JavaScript. Если же тут для вас ничего нового не нашлось — загляните на wtfjs.com.
JavaScript полон странностей
Неявное преобразование типов и явное преобразование типов
Неявное преобразование типов — палка о двух концах: это источник путаницы и ошибок, но это и полезный механизм, который позволяет писать меньше кода без потери его читабельности.
Три вида преобразования типов
Первая особенность работы с типами в JS, о которой нужно знать, заключается в том, что здесь есть только три вида преобразований:
Примитивные типы данных
▍Преобразование к типу String
Все примитивные типы преобразуются в строки вполне естественным и ожидаемым образом:
В случае с типом Symbol дело несколько усложняется, так как значения этого типа можно преобразовать к строковому типу только явно. Здесь можно почитать подробности о правилах преобразования типа Symbol.
▍Преобразование к типу Boolean
Обратите внимание на то, что операторы, вроде || и && выполняют преобразование значений к логическому типу для внутренних целей, а возвращают значения исходных операндов, даже если они не являются логическими.
▍Преобразование к типу Number
Неявное приведение значения к числовому типу — тема более сложная, так как оно применяется, пожалуй, чаще чем преобразование в строку или в логическое значение. А именно, преобразование к типу Number выполняют следующие операторы:
Вот как в числа преобразуются примитивные значения:
Вот два особых правила, которые стоит запомнить:
При применении оператора == к null или undefined преобразования в число не производится. Значение null равно только null или undefined и не равно ничему больше.
Значение NaN не равно ничему, включая себя. В следующем примере, если значение не равно самому себе, значит мы имеем дело с NaN
Преобразование типов для объектов
Вот псевдо-реализация метода [[ToPrimitive]] :
В целом, работа алгоритма выглядит следующим образом:
Вот пример поведения Date при преобразовании типов:
Стандартные методы toString() и valueOf() можно переопределить для того, чтобы вмешаться в логику преобразования объекта в примитивные значения.
Метод Symbol.toPrimitive ES6
Разбор примеров
Вооружённые теорией, вернёмся к выражениям, приведённым в начале материала. Вот каковы результаты вычисления этих выражений:
Разберём каждый из этих примеров.
▍true + false
Оператор + с двумя операндами вызывает преобразование к числу для true и false :
▍12 / ‘6’
▍«number» + 15 + 3
▍15 + 3 + «number»
▍[1] > null
Оператор сравнения > выполняет числовое сравнение [1] и null :
▍«foo» + + «bar»
▍’true’ == true и false == ‘false’
▍[] + null + 1
Логические операторы || и && в процессе работы приводят значение операндов к логическому типу, но возвращают исходные операнды (которые имеют тип, отличный от логического). Значение 0 ложно, а значение ‘0’ истинно, так как является непустой строкой. Пустой объект <> так же преобразуется к истинному значению.
▍[1,2,3] == [1,2,3]
Этот пример лучше объяснить пошагово в соответствии с порядком выполнения операций.
▍new Date(0) — 0
▍new Date(0) + 0
Итоги
Преобразование типов — это один из базовых механизмом JavaScript, знание которого является основой продуктивной работы. Надеемся, сегодняшний материал помог тем, кто не очень хорошо разбирался в неявном преобразовании типов, расставить всё по своим местам, а тем, кто уверенно, с первого раза, никуда не подсматривая, смог решить «вступительную задачу», позволил вспомнить какой-нибудь интересный случай из их практики.
Уважаемые читатели! А в вашей практике случалось так, чтобы путаница с неявным преобразованием типов в JavaScript приводила к таинственным ошибкам?
Операторы Javascript
В JavaScript существует множество различных операторов: арифметические операторы, операторы присваивания, строковые операторы, операторы сравнения, логические операторы, операторы типов, побитовые операторы.
Оператор присваивания (=) присваивает значение переменной:
Оператор сложения (+) складывает числа:
Оператор умножения (*) перемножает числа:
Арифметические операторы JavaScript
Арифметические операторы используются для выполнения арифметических операций с числами:
Оператор | Описание |
---|---|
+ | Сложение |
— | Вычитание |
* | Умножение |
/ | Деление |
% | Остаток от деления |
++ | Увеличение на 1 |
— | Уменьшение на 1 |
Операторы присваивания JavaScript
Операторы присваивания присваивают значения переменным JavaScript.
Строковые операторы JavaScript
Оператор сложения (+) также может использоваться для объединения (конкатенации) строк.
Также, для конкатенации строк можно использовать оператор присваивания +=:
При использовании со строками оператор + еще называют оператором конкатенации.
Сложение строк и чисел
Сложение двух чисел вернет сумму этих чисел, однако сложение числа и строки вернет строку:
В результате в переменных x, y, z мы получим 10, 55, Hello5 соответственно.
Помните! Если сложить число и строку, в результате получится строка!
Операторы сравнения JavaScript
Оператор | Описание | ||||
---|---|---|---|---|---|
== | равно | ||||
=== | равно по значению и типу | ||||
!= | не равно | ||||
!== | не равно по значению и типу | ||||
> | больше чем | ||||
= | больше или равно | ||||
> | Побитовый сдвиг вправо со знаком | 5 >> 1 | 0101 >> 1 | 10 | 2 |
>>> | Побитовый сдвиг вправо | 5 >>> 1 | 0101 >>> 1 | 10 | 2 |
Внимание! В примерах в таблице выше приведены 4-битные числа без знака. В действительности же JavaScript использует 32-битные числа со знаком. Таким образом, в JavaScript выражение
00000000000000000000000000000101 возвращает 11111111111111111111111111111010.
Преобразование типов в JavaScript
Преобразование типов это процесс конвертации значения из одного типа в другой (например, строки в число, объекта к булеву значению и т.д.).
Любой тип, будь то примитив или объект, может быть преобразован в другой тип.
В JavaScript есть 3 типа преобразования:
Строковое преобразование в JavaScript
Особенности строкового преобразования:
Примеры строкового преобразования:
Результатом toString может быть любой примитив.
Метод toString не обязан возвращать именно строку. Его результат может быть любого примитивного типа. Например, это может быть число, как в примере ниже:
Поэтому мы и называем его «строковое преобразование», а не «преобразование к строке».
Числовое преобразование в JavaScript
Подробнее обо всех операторах JavaScriptпо ссылке https://developer.mozilla.org
Особенности числового преобразования:
Исключения: NaN не равен ничему, даже самому себе. Оператор == обычно вызывает преобразование в число, но это не так в случае со значением null.
Примеры числового преобразования:
Булево (логическое) преобразование в JavaScript
Особенности булева преобразования:
Оператор | Использование | Описание |
Логическое И (&&) | expr1 && expr2 (Логическое И) |