Для чего логический оператор «!» (NOT) возле переменной с булевым значением?
Вопрос нубский, нубее некуда.
Есть ли простой жизненный пример, в котором было бы полезно переключить true на false?
В книге приведён достаточно непонятный юзкейс, какой смысл менять выходные на будни, чтобы не «принять сегодня душ»:
Простой 9 комментариев
ZakkMalin, знаете, когда крыс пускают в лабиринте, они там просто ходят-бродят и вообще не представляют, нафиг им это нужно. Однако когда потом снова запускают в тот же лабиринт, но уже с едой в конце лабиринта, то почему-то крысы внезапно быстро находят еду, хотя вторая контрольная группа крыс не может найти еду и остается голодной.
Думаю, вы потом поймете, зачем вам это нужно, когда наступит момент.
это ужасно неясный способ сделать преобразование типов.
таким образом, вы преобразуете значение в логическое, затем инвертируете его, а затем снова инвертируете.
!!expr возвращает логическое значение ( true или false ) в зависимости от truthiness выражения. Это имеет больше смысла при использовании на non-boolean типах. Рассмотрим эти примеры, особенно 3-й пример и далее:
Заварите чай:
в теории:
! определяет «истину», что значение не является:
!! определяет «истину» того, что такое значение не нет:
на практике:
каждая функция принимает аргумент для и attribute искать, но каждый из них возвращается различные значения, основанные на том, что определяют сравнения.
Но подождите, есть больше!
некоторые из вас, вероятно, заметили, что в этом конкретном примере можно просто проверить свойство, используя slightly более performant средства проверки, если объект в вопросе и свойства. Есть два способа сделать это:
мы отступать.
!! преобразует значение справа от него в эквивалентное логическое значение. (Подумайте, как бедный человек «набирает тип»). Его намерение обычно, чтобы донести до читателя, что код не заботится что значение в переменной, но что это «правды» стоимостью есть.
!!foo применяет унарный оператор not дважды и используется для приведения к булевому типу, аналогичному использованию унарного плюс +foo для приведения к номеру и объединения пустой строки »+foo приведение к строке.
вместо этих хаков вы также можете использовать функции конструктора, соответствующие примитивным типам (без используя new ) для явного приведения значений, т. е.
просто литье 🙁
просто сказать (foo)
и все становится еще безумнее, в зависимости от вашего двигателя. WScript, например, выигрывает приз.
сравнение truthiness 🙂
но что, если у меня есть два значения, которые мне нужно проверить на равенство truthi / falsi-ness?
я не могу подумайте о большом, не придуманном случае использования для этого. Может быть, у вас есть» связанные » поля в форме?
Итак, если у вас есть истина для обоих или ложь как для имени супруга, так и для возраста, вы можете продолжить. В противном случае у вас есть только одно поле со значением (или очень ранний брак) и нужно создавать дополнительную ошибку в вашей errorObjects коллекция.
редактировать 24 Окт 2017:
3-й партии библиотеки, ожидающие явных логических значений
документы JSX предлагают вам быть более явными, писать самостоятельное комментирование кода, и использовать сравнение с силой логическое. 0 &&
имейте в виду, что этой является соглашением JSX, не один присущий JavaScript.
но если вы видите странные 0 в оказанных JSX, думаю, потерять управление ложь.
это просто логический оператор NOT, дважды-он используется для преобразования чего-то в логическое, например:
он преобразует суффикс в логическое значение.
он имитирует поведение Boolean() функции литья. Первый NOT возвращает логическое значение независимо от того, какой операнд он задан. Второй NOT отрицает, что Boolean значение и так дает true логическое значение переменной. Конечный результат такой же, как при использовании Boolean() функция по значению.
Я думаю, стоит упомянуть, что условие в сочетании с логическим и / или не вернет логическое значение, но последний успех или первый сбой в случае && и первый успех или последний сбой в случае / / цепочки условий.
чтобы привести условие к истинному булеву литералу, мы можем использовать двойное отрицание:
Это не один оператор, это два. Это эквивалентно следующему и является быстрым способом приведения значения к boolean.
практическое использование
однако он имеет несколько практических применений.
Несмотря на своё название, данные операторы могут применяться к значениям любых типов. Полученные результаты также могут иметь различный тип.
Давайте рассмотрим их подробнее.
Оператор «ИЛИ» выглядит как двойной символ вертикальной черты:
В JavaScript, как мы увидим далее, этот оператор работает несколько иным образом. Но давайте сперва посмотрим, что происходит с булевыми значениями.
Существует всего четыре возможные логические комбинации:
Если значение не логического типа, то оно к нему приводится в целях вычислений.
Обычно оператор || используется в if для проверки истинности любого из заданных условий.
Можно передать и больше условий:
ИЛИ «||» находит первое истинное значение
Описанная выше логика соответствует традиционной. Теперь давайте поработаем с «дополнительными» возможностями JavaScript.
Расширенный алгоритм работает следующим образом.
При выполнении ИЛИ || с несколькими значениями:
Оператор || выполняет следующие действия:
Значение возвращается в исходном виде, без преобразования.
Другими словами, цепочка ИЛИ «||» возвращает первое истинное значение или последнее, если такое значение не найдено.
Это делает возможным более интересное применение оператора по сравнению с «чистым, традиционным, только булевым ИЛИ».
Получение первого истинного значения из списка переменных или выражений.
Сокращённое вычисление.
Операндами могут быть как отдельные значения, так и произвольные выражения. ИЛИ вычисляет их слева направо. Вычисление останавливается при достижении первого истинного значения. Этот процесс называется «сокращённым вычислением», поскольку второй операнд вычисляется только в том случае, если первого недостаточно для вычисления всего выражения.
Это хорошо заметно, когда выражение, указанное в качестве второго аргумента, имеет побочный эффект, например, изменение переменной.
В приведённом ниже примере x не изменяется:
Присваивание – лишь один пример. Конечно, могут быть и другие побочные эффекты, которые не проявятся, если вычисление до них не дойдёт.
Как мы видим, этот вариант использования || является «аналогом if «. Первый операнд преобразуется в логический. Если он оказывается ложным, начинается вычисление второго.
Эта глава описывает выражения и операторы языка JavaScript, такие как операторы присваивания, сравнения, арифметические, битовые, логические, строчные, и различные специальные операторы.
Полный и детальный список операторов и выражений также доступен в этом руководстве.
Операторы
В JavaScript есть следующие типы операторов. Данный подраздел описывает каждый тип и содержит информацию об их приоритетах друг над другом.
В свою очередь унарная операция использует один операнд, перед или после оператора:
Операторы присваивания
Существуют также составные операторы присваивания, которые используются для сокращённого представления операций, описанных в следующей таблице:
Деструктуризация
Операторы сравнения
Замечание: (=>) не оператор, а нотация Стрелочных функций.
Арифметические операторы
Арифметические операторы (en-US) используют в качестве своих операндов числа (также литералы или переменные) и в качестве результата возвращают одно числовое значение. Стандартными арифметическими операторами являются сложение (+), вычитание (-), умножение (*), и деление (/). При работе с числами с плавающей точкой эти операторы работают аналогично их работе в большинстве других языках программирования (обратите внимание, что деление на ноль возвращает бесконечность Infinity ). Например:
Кроме того, JavaScript позволяет использовать следующие арифметические операторы, представленные в таблице:
Битовые (поразрядные) операторы
Битовые операторы (en-US) обрабатывают свои операнды как последовательности из 32 бит (нулей и единиц), а не как десятичные, шестнадцатеричные или восьмеричные числа. Например, десятичное число 9 имеет двоичное представление 1001. Битовые операторы выполняют операции над таким двоичным представлением, но результат возвращают как обычное числовое значение JavaScript.
Возвращает единицу в каждой битовой позиции, для которой соответствующие биты обеих операндов являются единицами.
Побитовое ИЛИ (en-US)
a | b
Возвращает единицу в каждой битовой позиции, для которой один из соответствующих битов или оба бита операндов являются единицами.
Исключающее ИЛИ (en-US)
a ^ b
Возвращает единицу в каждой битовой позиции, для которой только один из соответствующих битов операндов является единицей.
Побитовое НЕ (en-US)
a
Заменяет биты операнда на противоположные.
Сдвиг влево (en-US)
a
Сдвигает a в двоичном представлении на b бит влево, добавляя справа нули.
Сдвиг вправо с переносом знака (en-US)
a >> b
Сдвигает a в двоичном представлении на b бит вправо, отбрасывая сдвигаемые биты.
Сдвиг вправо с заполнением нулями (en-US)
a >>> b
Сдвигает a в двоичном представлении на b бит вправо, отбрасывая сдвигаемые биты и добавляя слева нули.
Битовые логические операторы
Основной смысл работы битовых логических операторов состоит в следующем:
Примеры работы битовых операторов
Выражение
Результат
Двоичное описание
15 & 9
9
1111 & 1001 = 1001
15 | 9
15
1111 | 1001 = 1111
15 ^ 9
6
1111 ^ 1001 = 0110
Обратите внимание, что все 32 бита преобразуются с использованием битового оператора НЕ, и что величины с наиболее значимым (самым левым) битом равным 1 представляют собой отрицательные числа (в представлении дополнения до двух).
Битовые операторы сдвига
Битовые операторы сдвига используют два операнда: первый представляет величину, подлежащую сдвигу, а второй операнд указывает число битовых позиций на которое должен быть сдвинут первый операнд. Направление операции сдвига определяется используемым оператором.
Операторы сдвига преобразуют свои операнды в 32-битные целые числа и возвращают результат того же типа, каким является левый операнд.
Операторы сдвига перечислены в следующей таблице.
Логические операторы
Логические операторы (en-US) обычно используются с булевыми (логическими) значениями; при этом возвращаемое ими значение также является булевым. Однако операторы && и || фактически возвращают значение одного из операндов, поэтому, если эти операторы используются с небулевыми величинами, то возвращаемая ими величина также может быть не булевой. Логические операторы описаны в следующей таблице.
Примерами выражений, которые могут быть преобразованы в false являются: null, 0, NaN, пустая строка («») или undefined.
Следующий код демонстрирует примеры использования оператора && (логическое И).
Следующий код демонстрирует примеры использования оператора || (логическое ИЛИ).
Сокращённая оценка
Так как логические выражения вычисляются слева направо, они проверяются на возможность выполнения сокращённой оценки с использованием следующих правил:
Правила логики гарантируют, что данные вычисления всегда корректны. Обратите внимание, что часть «anything» представленных выше выражений не вычисляется, таким образом удаётся избежать любых побочных эффектов вычисления данной части.
Строковые операторы
В дополнение к операторам сравнения, которые могут использоваться со строковыми значениями, оператор (+) позволяет объединить две строки, возвращая при этом третью строку, которая представляет собой объединение двух строк-операндов:
Сокращённый оператор присваивания += также может быть использован для объединения (конкатенации) строк:
Условный (тернарный) оператор
Условный оператор является единственным оператором JavaScript, который использует три операнда. Оператор принимает одно из двух значений в зависимости от заданного условия. Синтаксис оператора:
val1 и val2 обязательно должны что-то возвращать, поэтому в этой конструкции нельзя использовать continue или break
Оператор запятая
Например, если a является двумерным массивом, каждая строка которого содержит 10 элементов, то следующий код с использованием оператора запятая позволяет выполнять одновременное приращение двух переменных. Данный код выводит на экран значения диагональных элементов массива:
Унарные операторы
delete
Оператор delete выполняет удаление объекта, свойства объекта, или элемента массива с заданным индексом. Синтаксис оператора:
Удаление элементов массива
Оператор typeof
Оператор typeof используется одним из следующих способов:
Оператор typeof возвращает строку обозначающую тип невычисленного операнда. Значение operand может быть строкой, переменной, дескриптором, или объектом, тип которого следует определить. Скобки вокруг операнда необязательны.
Предположим, вы определяете следующие переменные:
Оператор typeof возвращает следующие результаты для этих переменных:
Для дескрипторов true и null оператор typeof возвращает следующие результаты:
Для чисел и строк оператор typeof возвращает следующие результаты:
Для свойств оператор typeof возвращает тип значения данного свойства:
Для методов и функций оператор typeof возвращает следующие результаты:
Для встроенных объектов оператор typeof возвращает следующие результаты:
Оператор void
Оператор void используется любым из следующих способов:
Вы можете использовать оператор void для указания на то, что операнд-выражение является гипертекстовой ссылкой. При этом выражение обрабатывается, но не загружается в текущий документ.
Приведённый ниже код создаёт гипертекстовую ссылку, которая подтверждает отправку формы при клике на ней пользователем:
Операторы отношения
Оператор отношения сравнивает свои операнды и возвращает результат сравнения в виде булева значения.
Оператор in
Оператор in возвращает true, если указанный объект имеет указанное свойство. Синтаксис оператора:
Некоторые примеры способов использования оператора in :
Оператор instanceof
Оператор instanceof возвращает true, если заданный объект является объектом указанного типа. Его синтаксис:
Приоритет операторов
Приоритет операторов определяет порядок их выполнения при вычислении выражения. Вы можете влиять на приоритет операторов с помощью скобок.
Приведённая ниже таблица описывает приоритет операторов от наивысшего до низшего.
Таблица 3.7 Приоритет операторов
Тип оператора
Операторы
свойство объекта
. []
вызов, создание экземпляра объекта
() new
отрицание, инкремент
!
Более подробная версия данной таблицы, содержащая ссылки и дополнительную информацию по каждому оператору, находится в справочнике JavaScript.
Выражения
Выражением является любой корректный блок кода, который возвращает значение.
Концептуально, существуют два типа выражений: те которые присваивают переменной значение, и те, которые вычисляют значение без его присваивания.
Код 3 + 4 является примером выражения второго типа. Данное выражение использует оператор «+» для сложения чисел 3 и 4 без присваивания переменной полученного результата 7.
Все выражения в JavaScript делятся на следующие категории:
Основные выражения
Базовые ключевые слова и основные выражения в JavaScript.
Оператор this
Используйте ключевое слово this для указания на текущий объект. В общем случае this указывает на вызываемый объект, которому принадлежит данный метод. Используйте this следующим образом:
Предположим, функция validate выполняет проверку свойства value некоторого объекта; задан объект, а также верхняя и нижняя граница величины данного свойства:
Вы можете вызвать функцию validate для обработчика события onChange для каждого элемента формы, используя this для указания на элемент формы, как это показано в следующем примере:
Оператор группировки
Упрощённый синтаксис создания массивов и генераторов
[for (x of y) x] Упрощённый синтаксис для массивов. (for (x of y) y) Упрощённый синтаксис для генераторов.
Упрощённые синтаксисы существуют во многих языках программирования и позволяют вам быстро собирать новый массив, основанный на существующем. Например:
Левосторонние выражения
Значениям слева назначаются значения справа.
Вы можете использовать оператор new для создания экземпляра объекта пользовательского типа или одного из встроенных объектов. Используйте оператор new следующим образом:
super
Ключевое слово используется, чтобы вызывать функции родительского объекта. Это полезно и с классами для вызова конструктора родителя, например.
Оператор расширения
Оператор расширения позволяет выражению расширяться в местах с множеством аргументов (для вызовов функций) или множестве элементов (для массивов).
Похожим образом оператор работает с вызовами функций:
Операторы сравнения, логические операторы и условная конструкция if. else в JavaScript
В этой статье мы рассмотрим:
Условная конструкция if. else в JavaScript
Условная конструкция if. else в JavaScript имеет такой синтаксис:
Например, нужно узнать, является ли ли число, введенное пользователем, четным. Для реализации воспользуемся не формой, а диалоговым окном prompt() для ввода числа и alert() для вывода результата:
Операторы сравнения в JavaScript
Рассмотрим примеры использования операторов сравнения >, :
Код этого примера таков:
В этом примере использовано несколько условных конструкций if. else, т.к. нужно выполнить несколько проверок. Вывод результата происходит в абзац с id=»compareResult» с помощью свойства innerHTML.
Логические операторы
Логическое И
Попробуйте сами, нажав на кнопку ниже:
Логическое НЕ
Логическое НЕ используется для изменения значения логических переменных на противоположное. Например, у нас есть некая переменная
Все остальные значения воспринимаются в JavaScript как true.
Протестируем пример с логическим НЕ:
Логическое НЕ для изменения свойств элементов формы
Отлично логическое НЕ используется при работе с флажками (чекбоксами), когда в зависимости от того, отметил ли пользователь флажок, нужно сделать доступным или недоступным какое-либо текстовое поле или кнопку
Вывод: если нам нужно, чтобы элемент стал доступен ( disabled=false ) при выделении флажка ( checked=true ) нужно добавить перед свойством checked логическое НЕ (восклицательный знак), чтобы поменять его значение на противоположное. Очень компактное, хоть и не всегда сразу понятное решение задачи:
В примере ниже добавлен
Некий договор для проверки условия
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Doloribus corrupti cumque mollitia aperiam, doloremque possimus impedit, expedita cupiditate, iure amet earum provident quam! Optio consequatur eum, obcaecati, quaerat architecto error.
Eaque iusto nisi tempore quidem maxime, aperiam! Obcaecati doloribus saepe illum enim consequatur iure distinctio expedita sunt quo. Quae excepturi error voluptates dolor vero, blanditiis, laborum unde laboriosam animi sequi.
Asperiores eligendi fugit, veniam doloribus quidem saepe, quis, pariatur soluta vero totam dicta quibusdam placeat. Rerum vitae harum, eveniet deleniti officia architecto, earum repellat reiciendis, ullam sint in reprehenderit. Facilis.
Doloremque repudiandae dolores, odit, velit aspernatur ipsum laborum. Numquam natus sequi eos esse rem quibusdam sit aliquam illo optio sed laudantium quam iure aperiam tempora facilis facere, porro pariatur doloribus!
Eum possimus necessitatibus numquam molestias tenetur voluptas natus debitis, earum sint, quas, esse laborum enim commodi distinctio tempore suscipit aut! Rerum perspiciatis laboriosam nesciunt est magnam, quaerat voluptatibus, sit officia.
Necessitatibus laboriosam minus voluptatum, autem quam fugit doloremque tempora, soluta blanditiis reprehenderit sequi tenetur, provident nulla architecto ullam aut a voluptatem placeat! Excepturi minima, ratione distinctio fugit neque unde impedit.
Sapiente quisquam possimus veritatis tempore in nostrum nesciunt provident cumque optio ullam, ex eos repudiandae, quis est odit magni ad autem? Commodi hic perferendis quod dolores delectus, libero enim ut!
Логическое ИЛИ
Рассмотрим множественные условия с использованием логического ИЛИ. В примере ниже при клике на кнопку мы выводим пользователю трижды запрос на ввод числа в диапазоне от 0 до 255. Однако в любом из диалоговых окон, выводимых методом prompt() пользователь может ввести неверное число. Поэтому нам понадобится несколько условий с логическими ИЛИ: