Использование операторов сравнения равенства Ruby и Javascript

Операторы сравнения - важный инструмент в любом наборе разработчиков. Однако для тех, кто пишет Ruby и Javascript, что-то простое может вызвать головную боль. Хотя они работают одинаково для базовых объектов или примитивов, сравнения переменных и контейнеров (объектов в Javascript) будут действовать по-разному на двух языках.

Ruby == смотрит на характеристики двух объектов и решает, совпадают ли эти характеристики. Следовательно, так же, как 1 == 1 вернет истину, [1] == [1] также вернет истину. Все объекты в Ruby имеют идентификационный номер объекта. Эти сравнения вернут истину независимо от идентификатора объекта. Фактически, интересно отметить в этом примере, что идентификатор объекта 1 является статическим (как и все идентификаторы объектов основных целых чисел и логических значений **), в то время как идентификатор объекта массивов будет назначен при создании. Таким образом:

Как мы видим в приведенном выше примере, мы также можем узнать, действительно ли два объекта являются одним и тем же объектом, сравнив их идентификаторы с методом .object_id.

Если бы я взял Руби в свой гараж, он бы взглянул на мои машины и с радостью сказал бы, что да, у меня есть два одинаковых матовых черных Lambos. Спасибо, Руби!

Однако Javascript будет использовать свои операторы === или == по-разному (разница между == и === не входит в рамки этого скромного небольшого блога, но обсуждение различий можно найти здесь.) В Javascript сравнение производится не между содержимым объектов, а между самими объектами. Одно из основных различий между объектами Ruby и объектами Javascript заключается в том, что объекты Javascript не имеют идентификаторов объектов. Поэтому, чтобы определить, являются ли два объекта одинаковыми, Javascript проверяет, хранятся ли они в одном и том же месте в памяти.

Таким образом, примитивы, такие как 1 === 1, по-прежнему будут возвращать истину, а объекты, такие как[1] === [1], - нет. Это потому, что целые числа считаются примитивами и, следовательно, не имеют свойств. Однако массивы являются объектами в Javascript, и поиск местоположения в памяти используется, чтобы определить, совпадают ли они. Давайте взглянем:

Если бы я взял Javascript в свой гараж, он бы взглянул на мои аттракционы и с радостью сказал мне, что нет, у меня нет двух одинаковых матово-черных Lambo, потому что они явно припаркованы на двух разных парковочных местах. Спасибо, JS!

  • * Дальнейшее обсуждение идентификаторов статических объектов Ruby сверху: в Ruby целым числам и логическим значениям не присваиваются идентификаторы object_ids, а они несут их как атрибут. Следовательно, они всегда будут такими же. Идентификаторы объектов для целых чисел следуют шаблону x * 2 + 1. Таким образом, 1.object_id вернет 3, а 222.object_id вернет 445. False, true и nil несут идентификаторы объектов 0, 2 и 4 соответственно.
  • Для получения дополнительной информации об операторах Javascript и о том, как написать метод, который будет проверять, содержат ли два объекта одинаковые значения, нажмите здесь.