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