Изучение использования одинарных, двойных и тройных выражений со знаком равенства в 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

Вау…! Что тут происходит?

Оператор тройного равенства (также известный как оператор «три равенства») может проверить несколько вещей:

  1. Эквивалентно ли то, что слева, тому, что справа (функционирует как выражение двойного равенства (==)?
  2. Является ли вещь справа примером типа данных объекта слева?
  3. Попадает ли число слева в диапазон, представленный справа?
  4. Включает ли строка слева регулярное выражение справа?

Мы видели первые два в игре в приведенных выше примерах. Мы знаем, что 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

Как видите, не все выражения в программировании, использующие строго знак равенства, создаются одинаково, но, используя их правильно, вы можете присваивать значения переменным и проверять эквивалентность (или другие аспекты данных).

Удачного кодирования!