技術ブログ

(技術系中心)基本自分用備忘録なので、あくまで参考程度でお願いします。

RubyとJavaScriptの == と === の違い

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の演算子(== & ===)の違い

参考

プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで Software

JavascriptとRubyの演算子(== & ===)の違い - Qiita