Introduction
僕はJavaScriptからプログラミングの学習をスタートし、2年間フロントエンジニアとして、JavaScriptを書いてきた。その後バックエンドエンジニアに転身し、Rubyのコードをガリガリ書くようになった。
コードレビューを受けているうちに、
「RubyとJavaScriptの==と===の違いをちゃんと理解して使ってる?」
いう指摘を受けた。
僕はしばらくJavaScriptのノリでRubyを書いていて、同じようなものだろうと思っていた。しかし、調べたら全然違うものだった。
この辺を理解していなかったら、いずれなんらかの罠にハマっただろう。
Rubyの ==
・同じデータ型で、かつ同じ値だったら、trueを返す
・値が同じであっても、データ型が異なればfalseを返す
Example
1 == 1
=> true
1 == "1" # 数値と、文字列を比較
=> false
JavaScriptの ==
・同じ値だったらtrueを返す
・データ型が異なっても、値が同じであればtrueを返す!
Example
1 == 1
=> true
1 == "1" // 数値と、文字列を比較してもtrueが返ってくる。
=> true
このように、Rubyの ==
はちゃんと比較してくれるけれど、JavaScriptの==
の比較はゆるい。
Rubyの ===
・結構ややこしい。
・比較の対象が、どちらもオブジェクトの場合、==
と同じ挙動
Example
1 === 1 # どちらもオブジェクトなので == と同じ挙動。
=> true
・左辺がクラスの場合、右辺のオブジェクトが左辺のクラスのインスタンスかどうかを判定する。
・左辺のクラスが右辺のインスタンスであればtrueを返す。
・この比較は、case式でオブジェクトをテストするときに利用される。
参照: https://ref.xaio.jp/ruby/classes/module/eqq
Example
String === "hello" #"hello"はStringクラスのインスタンスなのでtrue
=> true
String === [] #[]はArrayクラスのインスタンスなのでfalse
=> false
Array === [] #[]はArrayクラスのインスタンスなのでtrue
=> true
JavaScriptの ===
・同じデータ型で、かつ値が同じであればtrueを返す
・つまりRubyの ==
と同じ
Example
1 === 1
=> true
1 === "1" // データ型が異なるので、ちゃんとfalseになる
false
・このように、Rubyの===
は使用ケースがあまり思いつかない。一方、JavaScriptの===
は、しっかり比較してくれるので積極的に利用すべきだと思う。
Summary
・JavaScriptの==
はゆるい比較になるので、基本的には===
を使用する
・Rubyの==
はしっかり比較してくれるので、基本的に==
を利用する
・注意すべきはJavaScriptの ===
を使用するノリで、Rubyで===
を使うこと。
・同様に、Rubyの==
を使用するノリで、JavaScriptで==
を使うこと。
・細かい所だけど、言語間でまったく違った意味になるので、ちゃんと理解してから使う。