Отметьте выражения значения которых равны true
Перейти к содержимому

Отметьте выражения значения которых равны true

Может ли в JavaScript конструкция (a==1 && a==2 && a==3) оказаться равной true?

Недавно по Твиттеру и Реддиту гулял интересный кусок кода на JavaScript. Вопрос, связанный с ним, заключался в следующем: «Может ли выражение (a==1 && a==2 && a==3) вернуть true ?». Ответ на вопрос, как ни странно, был положительным.

image

Сегодня мы разберём этот код и постараемся его понять.

Вот он:

Если вы используете Google Chrome, откройте консоль инструментов разработчика с помощью комбинации клавиш Ctrl + Shift + J в Windows, или Cmd + Opt + J в macOS. Скопируйте этот код, вставьте в консоль и убедитесь в том, что на выходе и правда получается true .

В чём тут подвох?

На самом деле, ничего удивительного тут нет. Просто этот код использует две базовые концепции JavaScript:

  • Оператор нестрогого равенства.
  • Метод объекта valueOf() .

Оператор нестрогого равенства

Обратите внимание на то, что в исследуемом выражении, (a==1 && a==2 && a==3) , применяется оператор нестрогого равенства. Это означает, что в ходе вычисления значения этого выражения будет использоваться приведение типов, то есть, с помощью == сравнивать можно значения разных типов. Я уже много об этом писал, поэтому не буду тут вдаваться в подробности. Если вам нужно вспомнить особенности работы операторов сравнения в JS — обратитесь к этому материалу.

Метод valueOf()

В JavaScript имеется встроенный метод для преобразования объекта в примитивное значение: Object.prototype.valueOf() . По умолчанию этот метод возвращает объект, для которого он был вызван.

Как сказано выше, когда мы вызываем valueOf() для объекта a , он просто возвращает сам объект:

Кроме того, мы можем использовать typeOf() для проверки того, действительно ли valueOf() возвращает объект:

Пишем свой valueOf()

Самое интересное при работе с valueOf() заключается в том, что мы можем этот метод переопределить для того, чтобы конвертировать с его помощью объект в примитивное значение. Другими словами, можно использовать valueOf() для возврата вместо объектов строк, чисел, логических значений, и так далее. Взгляните на следующий код:

Здесь мы заменили стандартный метод valueOf() для объекта a . Теперь при вызове valueOf() возвращается значение a.num .

Всё это ведёт к следующему:

Как видно, теперь valueOf() возвращает 0! Самое главное здесь то, что 0 — это то значение, которое назначено свойству объекта a.num . Мы можем в этом удостовериться, выполнив несколько тестов:

Теперь поговорим о том, почему это важно.

Операция нестрогого равенства и приведение типов

При вычислении результата операции нестрогого равенства для операндов различных типов JavaScript попытается произвести приведение типов — то есть он сделает попытку привести (конвертировать) операнды к похожим типам или к одному и тому же типу.

В нашем выражении, (a==1 && a==2 && a==3) , JavaScript попытается привести объект a к числовому типу перед сравнением его с числом. При выполнении операции приведения типа для объекта JavaScript, в первую очередь, попытается вызвать метод valueOf() .

Так как мы изменили стандартный метод valueOf() так, что теперь он возвращает значение a.num , которое является числом, теперь мы можем сделать следующее:

Неужто задача решена? Пока нет, но осталось — всего ничего.

Оператор присваивания со сложением

Теперь нам нужен способ систематически увеличивать значение a.num каждый раз, когда вызывается valueOf() . К счастью, в JavaScript есть оператор присваивания со сложением, или оператор добавочного присваивания ( += ).

Этот оператор просто добавляет значение правого операнда к переменной, которая находится слева, и присваивает этой переменной полученное значение. Вот простой пример:

Как видите, каждый раз, когда мы используем оператор присваивания со сложением, значение переменной увеличивается! Используем эту идею в нашем методе valueOf() :

Вместо того чтобы просто возвращать this.num , мы теперь, при каждом вызове valueOf() , будем возвращать значение this.num , увеличенное на 1 и записывать новое значение в this.num .

После того, как в код внесено это изменение, мы наконец можем всё опробовать:

Пошаговый разбор

Помните о том, что при использовании оператора нестрогого равенства JS пытается выполнить приведение типов. Наш объект вызывает метод valueOf() , который возвращает a.num += 1 , другими словами, возвращает значение a.num , увеличенное на единицу при каждом его вызове. Теперь остаётся лишь сравнить два числа. В нашем случае все сравнения выдадут true .

Возможно, полезно будет рассмотреть происходящее пошагово:

Итоги

Полагаем, примеры, подобные разобранному выше, помогают, во-первых, лучше изучить базовые возможности JavaScript, а во-вторых — не дают забыть о том, что в JS не всё является тем, чем кажется.

Уважаемые читатели! Если вы знаете о каких-нибудь курьёзах из области JavaScript — просим ими поделиться.

Тип Boolean, логические операторы и операторы сравнения

Логический тип Boolean в JavaScript представляет одно из двух значений: true (истина) или false (ложь).

Значения Boolean

В программировании очень часто бывают ситуации, когда требуется тип данных, который может принимать одно значение из двух, вроде

  • ДА / НЕТ
  • ВКЛ / ВЫКЛ
  • ИСТИНА / ЛОЖЬ

Именно для этих случаев в JavaScript существует логический тип данных Boolean, который может принимать только значение true (истина) или false (ложь).

Функция Boolean()

Чтобы определить, является ли выражение (или переменная) истиной (возвращает значение true), можно воспользоваться функцией Boolean():

Или можно сделать еще проще:

Все имеет «значение» True или False

Любое значение отличное от 0 имеет логическое значение true.

Логическое значение 0 (ноль) — false.

Логическое значение -0 (минус ноль) — false.

Логическое значение «» (пустая строка) — false.

Логическое значение undefined — false.

Логическое значение null — false.

Логическое значение false — false.

Логическое значение NaN — false.

Значения типа Boolean могут быть объектами

Обычно, логические значения типа Boolean определяются примитивными литералами:

Однако, в JavaScript при помощи ключевого слова new логические значения также можно определить и как объекты:

Тем не менее, не определяйте значения типа Boolean как объекты. Это замедляет скорость выполнения скрипта. Кроме этого, ключевое слово new в данном случае усложняет код и может привести к неожиданным результатам:

При использовании оператора сравнения ==, одинаковые значения типа Boolean равны:

Однако, при использовании оператора сравнения ===, одинаковые значения типа Boolean не будут равными, потому что оператор === ожидает совпадения как по значению, так и по типу.

Или еще хуже. Объекты не сравниваются:

Обратите внимание на разницу между (x==y) и (x===y).

Сравнение двух объектов JavaScript всегда возвращает ложь (false).

Логические операторы и операторы сравнения

Логические операторы и операторы сравнения используются для проверки выражений и переменных на соответствие какому-либо условию.

Значения типа Boolean лежат в основе всех сравнений и условий в JavaScript.

Операторы сравнения

Операторы сравнения используются в логических выражениях для определения совпадения или различия между переменными или значениями.

Предположим, что у нас есть x = 5. Следующая таблица объясняет операторы сравнения:

Оператор Описание Выражение Возвращает
== равно x == 8
x == 5
x == «5»
false
true
true
=== равно по значению и типу x === 5
x === «5»
true
false
!= не равно x != 8 true
!== не равно ни по значению, ни по типу x !== 8
x !== 5
x !== «5»
true
false
true
> больше чем x > 8 false
< меньше чем x < 8 true
>= больше или равно x >= 8 false
<= меньше или равно x <= 8 true

Как это можно использовать

Операторы сравнения используются в выражениях условий для сравнения значений и принятия решения в зависимости от полученного результата:

Подробнее об условных выражениях будет рассказано в следующей главе этого учебника.

Логические операторы

Логические операторы используются для определения логической связи между переменными или значениями.

Предположим, у нас есть x = 6 и y = 3. Следующая таблица объясняет логические операторы:

Оператор Описание Пример
&& И (x < 10 && y > 1) — true
|| ИЛИ (x == 5 || y == 5) — false
! НЕ !(x == y) — true

Оператор ! также используется для быстрого преобразования выражения к логическому значению:

Условный (тернарный) оператор

В JavaScript есть особый условный оператор, который присваивает переменной значение в зависимости от заданного условия.

имя_переменной = (условие) ? значение1 : значение2

В данном примере если в переменной age значение меньше 18, то переменной voteable будет присвоена строка «Слишком молод», в обратном случае переменной voteable будет присвоена строка «Возраст подходит».

Сравнение разных типов

Сравнение данных разного типа может привести к неожиданным результатам.

При сравнении строки и числа JavaScript будет преобразовывать строку в числовое значение. Пустая строка преобразуется в 0. Не числовая строка преобразуется в значение NaN, которое всегда равно false.

Выражение Значение
2 < 12 true
2 < «12» true
2 < «John» false
2 > «John» false
2 == «John» false
«2» < «12» false
«2» > «12» true
«2» == «12» false

При сравнении двух строк значение строки «2» будет больше значения строки «12», потому что в алфавитной последовательности 1 меньше 2.

Чтобы обезопасить результаты сравнения, переменные следует привести к надлежащему типу:

Запишите в ответе номера тех выражений, значение которых равно -5 1)-4*1,25+10 2)-4*(-1,25)-10 3) 4*(-1,25)-10 4) 4*1,25-10

В данном задании вам необходимо определить выражения, значения которых равны — 5.

  • — 4 * 1,25 + 10.
  • — 4 * (- 1,25) — 10.
  • 4 * (- 1,25) — 10.
  • 4 * 1,25 — 10.

Записываете решение первого выражения

  • Сначала выполняем действие умножение: — 4 * 1,25 + 10 = — 5 + 10.
  • Далее выполняете действие вычитание: — 5 + 10 = 5.
  • Значение данного выражения равно 5.

Записываете решение второго выражения

  • Сначала выполняете действие умножение: — 4 * (- 1,25) — 10 = 5 — 10.
  • Далее выполняете действие вычитание: 5 — 10 = — 5.
  • Значение данного выражения равно — 5.

Записываете решение третьего выражения

  • Сначала выполняем действие умножение: 4 * (- 1,25) — 10 = — 5 — 10.
  • Затем складываете отцательные числа: — 5 — 10 = — 15.
  • Значение данного выражения равно — 15.

Записываете решение четвёртого выражения

  • Выполняете действие умножение: 4 * 1,25 — 10 = 5 — 10.
  • Затем выполняете действие вычитание 5 — 10 = — 5.
  • Значение данного выражения равно — 5.

Следовательно, правильный вариант ответа номер 2 и 4.

Ответ: номер 2 и номер 4.

Определим значение следующих выражений. Записываем полученное решение.

1) — 4 * 1,25 + 10 = — 5 + 10 = 5.

Выполняем действие умножение и вычитание. В результате получается ответ равный 5.

2) — 4 * (- 1,25) — 10 = 5 — 10 = — 5.

Выполняем действие умножение и вычитание. В результате получается ответ равный — 5.

3) 4 * (- 1,25) — 10 = — 5 — 10 = — 15.

Выполняем действие умножение и складываем отрицательные числа. В результате получается ответ равный — 15.

4) 4 * 1,25 — 10 = 5 — 10 = — 5.

Выполняем действие умножение и вычитание. В результате получается ответ равный — 5.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *