オブジェクトをプリミティブ型へ変換
厳密等価演算子や等価演算子を利用して変数を比較する場面が多く存在ある。
厳密等価演算子:===
等価演算子:==
厳密等価演算子を利用した場合は、比較対象とする変数の型が等価である必要があり、型が異なる場合では必ずfalseと評価される。
一方、等価演算子を利用した場合は、比較対象とする変数の型が等しくなければ、変数が型変換された上で評価される。
等価演算子を用いて型の異なる変数を比較する際、JavaScriptは一体どのように型変換を行っているのだろうか?JavaScriptの書籍を読んだり、コードを実行しながら理解を深めてみた。まずはプリミティブ型同士の比較から、
Number型とString型の比較
String型をNumber型に変換して値を比較する
"1" == 1 // 1 == 1に変換される?
"hoge" == 1 // NuN == 1に変換される?
Boolean型とNumber型/String型の比較
Boolean型のオペランドが数値に変換された上で比較される。
trueは1に変換され、falseは0に変換される。
true == 0 // 1 == 0 に変換される?
true == "hoge" // 1 == NaNに変換される?
String型やBoolean型の変数は一度Number型に変換された上で比較が行われる。
次にオブジェクトの比較、
Object同士の比較
同じオブジェクト同士を比較する場合のみtrue
var obj1 = {}
var obj2 - {}
obj1 == obj1 // true
obj1 == obj2 // false
var func = function() {}
var func1 = new func();
var func2 = new func();
func1 == func1 // true
func1 == func2 // false
※ JSではインスタンスもObject型の変数として処理される
typeof func1 // "object"
オブジェクトとプリミティブ型の比較
Number型と比較する場合はオブジェクトをNumber型へ変換した上で比較される
- オブジェクトをNumber型へ変換
- valueOf()メソッドが存在し、尚且つ返り値がプリミティブ型の場合はその値がNumber型に型変換される。
- 上記以外の場合は、toString()メソッドを呼び出す。toString()メソッドが存在し、尚且つ返り値がプリミティブ型である場合はその値がNumber型に型変換される。
- 上記以外の場合は、ランタイムエラー(TypeError)をスローする。
String型と比較する場合はオブジェクトをString型へ変換した上で比較される
- オブジェクトをString型へ変換
- toString()メソッドが存在し、尚且つ返り値がプリミティブ型の場合はその値がString型に型変換される。
- 上記以外の場合は、valueOf()メソッドを呼び出す。valueOf()メソッドが存在し、尚且つ返り値がプリミティブ型である場合はその値がString型に変換される。
- 上記以外の場合は、ランタイムエラー(TypeError)をスローする。
オブジェクトとBooleanの比較は、双方がNumber型に変換されて比較が行われる?
var obj = {i:1, valueOf: function(){return this.i}}
obj == 1 // true
今回の学習を通して、型変換の仕組みがなんとなく理解出来た気がする。