javascriptのtypeofとinstanceofとボクシング

http://kokudori.hatenablog.com/entry/20120915/1347705807

typeof

typeof は変数の型を、文字列型で返す演算子。そういう関数だと理解してもいい。

JavaScript 上に存在する型は全部で6種類です。
Number, String, Boolean, Null, Undefined, Object の計6種類。
※ただし仕様バグでtypeof nullは"object"を戻す (本来は"null"を戻すはず)
※ただし大抵の実装ではtypeof function(){}は"function"を戻す (本来は"object"を戻すはず)

使い方。

console.log(typeof 123);          // "number"
console.log(typeof "abc");        // "string"
console.log(typeof true);         // "boolean"
console.log(typeof new Object()); // "object"

console.log(typeof new Array());  // "object"
// Array型ではない点に注意!javascriptにはクラスは存在しない。
// new Array()は正確にはArray型のオブジェクトではなく、Array.prototypeをプロトタイプにしたobject型のオブジェクトである。

instanceof

instanceof はオブジェクトがどのコンストラクタ(関数オブジェクト)から生成されたかを判断するための演算子
prototypeチェーンを追っているようで、親だけではく祖先のコンストラクタを指定した場合もtrueになる。
二項演算子である。
使い方。

console.log(new Object() instanceof Object);  // true
console.log(new Array()  instanceof Object);  // true
console.log(new Array()  instanceof Array);   // true

console.log(123 instanceof Object);           // false。number型の値はそもそもコンストラクタから作られたものでは無いため、何を指定してもfalseになる。

ボクシング(boxing)について

javascriptでは、object型以外はメソッドやプロパティを持つことが出来ない。
そのため「"abc".toUpperCase()」のようなコードは、string型に対するメソッドを呼び出しているので本来動作しないはずである。しかし実際には動作する。
この動作は、「string型の値」に対するメソッドを呼び出そうとしたときに「Stringというコンストラクタから作られたオブジェクト」を自動的に作成することで実現されている。

"abc".toUpperCase();
// ↓ 内部的には以下のように変換されて実行されている (new String('abc')).toUpperCase();この値をラッピングしたオブジェクトを生成することをボクシングと呼ぶ。



http://ufcpp.net/study/csharp/RmBoxing.html
C#にもボクシングの機能がある。しかしC#の場合は(概念的には)数値型もObject型を継承しているためjavascriptで問題だった「数値型はメソッドを持てない」といった理由でのボクシングは不要になっている。
C#のボクシングは、内部的にメモリをどう利用するか(メモリに直接値を格納するか、メモリにオブジェクトの存在するアドレスを格納するか)を自動的に調整してくれる機能として存在する。

int n = 123;    // メモリに直接、123という値が格納されている
object o = n;   // object型は、メモリにオブジェクトの存在するアドレスを格納する。
                // しかしnはメモリに直接123という値を格納しているので、「オブジェクトの存在するアドレスを格納」することができない。
                // ここでボクシングが行わる。123という値を持つオブジェクトを生成して、そのアドレスがoに代入される。