まめージェント

Android, GAE, AngularJSの技術ネタ中心。Twitter: @mame01112

Javascriptのイコール2つと3つの違い (派生してオブジェクトとプリミティブ型)

そもそも

もろJavascript初心者な感じですが、ソースコードを読んでいて、if文などで比較をするときにイコール2つと3つのケースがあって、何がどう違うんだ?とモヤモヤしたので記載。

Javascriptエキスパートな方は読み飛ばしてくださいませ。

簡単にいうと?

・イコール2つ: 型変換を行った上での比較
・イコール3つ: 型の違いも含めた上での比較
・・・だそうです。

ので、

var x = 1;
var y = "1";

if(x == y) // false、
if(x === y) // true

となりますね。

これがある理由?

・・・という上記の内容が分かったところで、「じゃあなんでこの2つの比較方法があるの?」「実際にどんなケースで使われることを想定しているの?」というところが気になり調べてみました。どうやら、オブジェクトとプリミティブ型があるため、この比較方法があるようです

オブジェクトとプリミティブ型の違い

こちらも簡単に書くと、
・オブジェクト: 値のほかに、さまざまなプロパティやメソッドを持つことができる
・プリミティブ型: 値のみを持ち、プロパティやメソッドを持つことができない
という違いです。
※ただ、プリミティブ型.lengthのような、"実は内部でオブジェクト作ってます"みたいなこともあるようですが・・・。

そして、オブジェクトは参照渡し、プリミティブ型は値渡しとなっています(このあたりはJavaと同じですね)ので、オブジェクト型の変数には値がそのまま入っているのではなく、その値に対してのアドレスが保存されます。

ので、オブジェクト型を別の変数に入れた後にそれを書きかえると、元のオブジェクトの値も変わってしまった・・・というような、”あるある”な不具合も起きそうです (そしてJavascriptで不変オブジェクトを実現することもできるようですが、こちらは何か大変そう(笑)なので次回以降・・・)

じゃあ何故オブジェクトとプリミティブ型がある?

こちらもいろいろと調べてみましたが、まず間違いなさそうなところとしては、
”プリミティブ型はメモリの節約になる”点があるようです(とはいえ、オブジェクト型に余計なメソッドを持たせなければ問題ないのでは?という気もしており、ここは再度調べてみます・・・)

そして、パフォーマンスもプリミティブ型の方が早いようです。そりぁあ、値を直接取得するのと、アドレスから値を取得しに行くのでは、値を直接参照する方が早いのは想像ができます。

ということで、オブジェクト型とプリミティブ型の両方が必要なので・・・

それらを比較するためのイコール2つとイコール3つが存在するようです(半ば強引に結論に持って行きました・・・)

今回の話(特に後半)、書きながらいろいろと「ん?」と思うところもあったので、今後何か分かったら加筆/修正したいと思います。

以上、Javascriptのオブジェクトとプリミティブ型の違いと、そこに紐づくイコール2つ / 3つの話でした!