6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-03-08

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で==を使うこと。
・細かい所だけど、言語間でまったく違った意味になるので、ちゃんと理解してから使う。

6
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?