データ構造の平等性


ここ数週間、私は読書をしてきたJavaScript Allongé Reginald Braithwaite(機能プログラミングレンズを介してJSの基礎に優れた外観)で同僚と.私の同僚は彼女に意味をなさなかった何かを育てた.

In JavaScript, why isn't an empty array equal to an empty array? What's the difference between the two identical objects?



JavaScriptを使って作業している人にとっては、答えは簡単に思えるかもしれませんしかし、私の友人のようなrubyistは、それを違って見るかもしれません私が見ているように、これはRubyとJavaScriptの比較演算子の意味の違いです.つの言語はデータ構造を比較するためにオブジェクト等価性の概念を使用します、一方、他方はオブジェクトアイデンティティのために明らかにチェックします.
注:私は議論するつもりはないJS double equal or Ruby's threequal 演算子は、これらの単純な比較演算子よりも(私はまた、それらを使用しないように混乱し、誤解を招く可能性があります!).

ルビーにおけるデータ構造の等価性


組み込みの動作を使用してデータ構造を比較するとき== Rubyでは、実際にオブジェクトの内容を比較し、配列の場合は、両方の要素の順序が同じであることを確認しています.これは、メモリ内の異なるオブジェクトを指す2つの変数が等しいことを意味します.
> first_array, second_array = [1,2,3], [1,2,3]

> first_array == second_array
=> true
何らかの理由であなたが本当に2つの変数が同じオブジェクトを参照しているのをチェックして、見たいならば、あなたはオブジェクトのIDをチェックすることができるか、好ましくは.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の比較演算子は、実際に比較しているクラスで定義されたメソッドですhere ). 以来== ただの方法です、あなたが好きならそれをオーバーライドすることができます!お互いを比較する必要があるカスタムクラスを書いているなら、これは合理的な練習です.下記の愚かな例
> class Ditto
*   def self.==(other)
*     true
*   end
* end

> Ditto == 'Pikachu'
=> true
> Ditto == 2
=> true
> Ditto == false
=> true

データ構造の類似性


Rubyと異なり、JavaScriptはオブジェクトの一意のIDを公開しません.データ構造は、デフォルトでアイデンティティによって比較されます.つの変数が等しい場合、メモリ内の同じオブジェクトを指すことを確認できます.
> const firstArray = [1,2,3]
> const secondArray = [1,2,3]
> firstArray === secondArray
false
2つの別々のデータ構造が同じ内容を持っているかどうかチェックして見たいなら、あなた自身の論理を書いて、ライブラリから関数をチェックするか、または使用する必要があります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ドクター


ジャバスクリプト=== 2つの変数が同じデータ構造に比較されているかどうかを確認する== メソッドは、2つの配列またはハッシュの内容が等しいかどうかを確認します.

ルビーの[1,2,3] == [1,2,3] 翻訳する[1,2,3].every((el, index) => el === [1,2,3][index]) JSで.
ジャバスクリプト[1,2,3] === [1,2,3] 翻訳する[1,2,3].equal?([1,2,3]) Rubyで.

参考文献


うまくいけば、これはあなたが2つの異なる言語がデータ構造を比較するとき、あなたの心を包むのを援助します!あなたがより深くなることに興味があるならば、私はいくつかの引用をまとめました:
  • MDN docs on equality and sameness in JS

  • A fun JavaScript equality table ボーナスポイントif() 説明!)
  • Intro to Ruby's Comparison Operators
  • RubyMonk's custom .== method example