Rubyの == と === の違い
Rubyで等値を判断する為のメソッドで有名なのは以下の通り
1. equal? 2. == 3. eql? 4. ===
==
・同じデータ型で、かつ同じ値だったら、trueを返す ・値が同じであっても、データ型が異なればfalseを返す
1 == 1 => true 1 == "1" # 数値と、文字列を比較 => false
===
===は主にcaseのwhen節で利用されるケースが多いです。
ややこしいのですが、以下の特徴があるようです。
・左辺がクラスの場合、右辺のオブジェクトが左辺のクラスのインスタンスかどうかを判定する。 ・左辺のクラスが右辺のインスタンスであればtrueを返す。
String === "hello" #"hello"はStringクラスのインスタンスなのでtrue => true String === [] #[]はArrayクラスのインスタンスなのでfalse => false Array === [] #[]はArrayクラスのインスタンスなのでtrue => true
JavaScriptの == と === の違い
==
・同じ値だったらtrueを返す
・データ型が異なっても、値が同じであればtrueを返す。(ここがRubyとは違うところですね)
1 == 1 => true 1 == "1" // 数値と、文字列を比較してもtrueが返ってくる。 => true
少しややこしいですが、等価演算子(==)はオペランド同士が異なる型の値であった場合に、 同じ型となるように暗黙的な型変換をしてから比較します。
// 文字列を数値に変換してから比較 console.log(1 == "1"); // => true // "01"を数値にすると`1`となる console.log(1 == "01"); // => true // 真偽値を数値に変換してから比較 console.log(0 == false); // => true // nullの比較はfalseを返す console.log(0 == null); // => false // nullとundefinedの比較は常にtrueを返す console.log(null == undefined); // => true
===
・同じデータ型で、かつ値が同じであればtrueを返す
・つまりRubyの ==と同じ
1 === 1 => true 1 === "1" // データ型が異なるので、ちゃんとfalseになる false
暗黙的な変換により、思わぬバグになる可能性があるので。
基本的には===を利用することをお勧めします。
まとめ
こちらの記事を参考にしたのですが、普段はRubyエンジニアなのでRubyの==と===に慣れていてのでJavaScriptでも同じように書いていたらハマってしまいました。
↓
JavascriptとRubyの演算子(== & ===)の違い