Изучение использования одинарных, двойных и тройных выражений со знаком равенства в JavaScript и Ruby
Когда дело доходит до языков программирования, одним из наиболее важных символов, которые можно использовать, является знак равенства (=). Однако, когда мы работаем с переменными, важно отметить, что не все выражения со знаками равенства создаются одинаково. Рассмотрим эти основные математические утверждения:
x = 6
y = 6
x = y
В приведенных выше примерах = используется ОБЕ, чтобы установить переменные x и y в значение 6, И чтобы указать, что две переменные равны по значению.
К сожалению, языки программирования не допускают такой же гибкости при использовании знака =. В зависимости от того, что вы пытаетесь выполнить для демонстрации эквивалентности, важно отметить, как это должно быть выражено на выбранном вами языке программирования. Давайте посмотрим, как это работает с двумя языками программирования:
JavaScript
В JavaScript у нас есть три варианта выражений, которые строго используют =. Давайте посмотрим на некоторый код:
let number = 6 //=> undefined
В приведенном выше примере мы используем одиночное = для присвоения значения переменной. Обратите внимание, что в JavaScript эта строка часто сопровождается var
, const
или let
впереди.
Что, если мы хотим проверить эквивалентность переменной number
другим вещам? Давайте посмотрим, как это работает, используя два знака равенства:
number == 6 //=> true number == “6” //=> true number == 7 //=> false
Что это за тестирование?
В первом сравнении мы знаем, что переменная number
равна 6, поэтому, конечно, это выражение дает результат true
, но как насчет второго выражения?
Это должно иметь смысл, опять же, верно? 6
и “6”
по сути должны быть равны, но помните, что типы данных имеют значение. Переменная number
равна числу, а не строке. Однако “6”
— это строка. Так как же эти два значения могут эквивалентно возвращать true, даже если они относятся к разным типам данных?
Это связано с тем, что выражение double equals (==) в JavaScript известно как абстрактное сравнение равенства и определяет «свободное равенство». Когда JavaScript оценивает это выражение, он автоматически выполняет преобразование типов, поэтому элементы с обеих сторон выражения могут быть оценены без несоответствия типов данных.
Примечание. Будьте осторожны при использовании двойного равенства в JavaScript, так как это может привести к странным результатам. Например:
const emptyString = '' //=> undefined emptyString == 0 //=> true
Давайте добавим третий знак равенства и посмотрим, как на этот раз эти выражения оцениваются JavaScript.
number === 6 //=> true number === “6” //=> false number === 7 //=> false
Тройное равенство (===) оценивает сравнение строгого равенства и обычно должно быть вашим переходом при выполнении условий и сравнений, поскольку оно возвращает false
, если типы данных не совпадают.
Прежде чем покинуть JavaScript, давайте посмотрим, что произойдет, если мы попытаемся использовать один знак равенства в условном выражении.
if (number = 7) { console.log(“This should not log because number is set to 6.”) } //=> This should not log because number is set to 6.
О-о… что здесь произошло? Разве переменная number
не равна 6? Давайте проверим это…
number //=> 7
Упс.
Вот почему в JavaScript вы должны использовать либо (==), либо (===) при сравнении значений. Использование единственного выражения равенства (=) автоматически присваивает значение переменной независимо от того, где оно встречается в программе.
Рубин
Как и JavaScript, Ruby работает по-разному в зависимости от того, сколько знаков равенства присутствует в выражении. Давайте установим нашу переменную number
в Ruby:
number = 6 => 6
Достаточно легко. Теперь сравним с выражением double equals:
number == 6 => true number == “6” => false number == 7 => false
В отличие от JavaScript, строгое сравнение в Ruby выполняется с помощью оператора двойного знака равенства (==). Он не допускает свободной эквивалентности, поэтому сравниваемые значения должны быть одного типа данных. Исключение составляют типы данных Ruby Float
и Integer
.
Примечание.
floated_number = 6.0 => 6.0 number == floated_number => true
Стоит отметить, что в Ruby ДЕЙСТВИТЕЛЬНО есть оператор сравнения, использующий тройной знак равенства (===). Однако он проверяет эквивалентность на совершенно другом уровне.
Давайте посмотрим:
number === 6 => true floated_number === number => true Integer === number => true Integer === floated_number => false
Вау…! Что тут происходит?
Оператор тройного равенства (также известный как оператор «три равенства») может проверить несколько вещей:
- Эквивалентно ли то, что слева, тому, что справа (функционирует как выражение двойного равенства (==)?
- Является ли вещь справа примером типа данных объекта слева?
- Попадает ли число слева в диапазон, представленный справа?
- Включает ли строка слева регулярное выражение справа?
Мы видели первые два в игре в приведенных выше примерах. Мы знаем, что number
и floated_number
эквивалентны согласно оператору сравнения double equals.
Третий и четвертый примеры являются тестовым сравнением пункта №2.
Переменная number
имеет тип данных Integer
, поэтому выражение возвращает true
. Однако floated_number
имеет тип данных Float
, а не Integer
, поэтому выражение threequals здесь возвращает false
.
Давайте посмотрим еще на несколько выражений, чтобы увидеть пункты №3 и №4:
(2..8) === number => true (1..5) === number => false number_as_string = “six” => "six" Integer === number_as_string => false String === number_as_string => true /i/ === number_as_string => true
И последнее, что стоит отметить в отношении оператора «три равных». За исключением пункта № 1 выше, размещение имеет значение при оценке выражения. Рассмотрим следующее:
Integer === number => true number === Integer => false (2..8) === number => true number === (2..8) => false /i/ === number_as_string => true number_as_string === /i/ => false
Как видите, не все выражения в программировании, использующие строго знак равенства, создаются одинаково, но, используя их правильно, вы можете присваивать значения переменным и проверять эквивалентность (или другие аспекты данных).
Удачного кодирования!