Равенство структур данных: Ruby против JavaScript
Coding
Равенство структур данных в Ruby
Когда вы сравниваете структуры данных, используя встроенное поведение ==Ruby, вы действительно сравниваете содержимое объекта - и в случае массива вы также проверяете, что порядок элементов одинаков в обоих , Это означает, что две переменные, которые указывают на разные объекты в памяти, могут быть равны.
> first_array, second_array = [1,2,3], [1,2,3] > first_array == second_array => true
Если по какой-то причине вы действительно хотите проверить и увидеть, что две переменные ссылаются на один и тот же объект, вы можете проверить идентификатор объекта или, предпочтительно, использовать .equal?метод:
> first_array, second_array = [1,2,3], [1,2,3] > first_array.object_id == second_array.object_id # 70176467875700 == 70176467875680 => false > first_array.equal?(second_array) # a clearer way to perform this comparison => false
В отличие от JavaScript, оператор сравнения в Ruby на самом деле является методом, определенным в классе, который вы сравниваете (потрясающее прохождение этой концепции здесь ).
Так как ==это всего лишь метод, вы можете даже переопределить его, если хотите! Это разумная практика, если вы пишете пользовательские классы, которые нужно сравнивать друг с другом. Глупый пример ниже:
> class Ditto * def self.==(other) * true * end * end > Ditto == 'Pikachu' => true > Ditto == 2 => true > Ditto == false => true

Равенство структур данных в JavaScript
В отличие от Ruby, JavaScript не предоставляет уникальный идентификатор для объектов, потому что в этом нет необходимости . Структуры данных сравниваются по идентичности по умолчанию. Если две переменные равны, вы можете быть уверены, что они указывают на один и тот же объект в памяти.
> const firstArray = [1,2,3] > const secondArray = [1,2,3] > firstArray === secondArray false
Если вы хотите проверить и увидеть, имеют ли две отдельные структуры данных одинаковое содержимое, вам придется написать собственную логику для проверки - или использовать функцию из библиотеки, например, Lodash .
// Super naïve implementation:
const arraysAreEqual = (array1, array2) => {
return array1.every((el, index) => el === array2[index])
}
> arraysAreEqual([1,2,3],[1,2,3])
true
> arraysAreEqual([1,2,3],['a','b','c'])
false
TL; DR
JavaScript=== проверяет, равны ли по значению две вещи, которые он сравнивает, в то время как== метод Ruby проверяет, является ли содержимое двух массивов или хэшей эквивалентным.

Руби [1,2,3] == [1,2,3]переводится как [1,2,3].every((el, index) => el === [1,2,3][index])в JS.
JavaScript [1,2,3] === [1,2,3]переводится [1,2,3].equal?([1,2,3])в Ruby.
Рекомендации
Надеюсь, это поможет вам понять, чего ожидают два разных языка при сравнении структур данных! Если вам интересно углубиться, я собрал несколько ссылок:
- MDN документы о равенстве и одинаковости в JS
- Забавная таблица равенства JavaScript (бонусные баллы за
if()объяснения!) - Введение в операторы сравнения Ruby
- Пример пользовательского
.==метода RubyMonk

Заметили ошибку или есть вопросы?Рассказывай нам о них,связаться с нами ты сможешь с помощью нашего чата или же с помощью бота обратной связь
Не забывайте ставить 👍 если вам понравилась и подписаться на канал,а так же посетить наш чат.