GitBookjs-primerラッパーオブジェクトJavaScriptのデータ型はプリミティブ型とオブジェクトに分けられます(詳細は「データ型とリテラル」を参照)。次のコードでは文字列リテラルでプリミティブ型の値である文字列を定義しています。プリミティブ型の値である文字列はStringオブジェクトのインスタンスではありません。プリミティブ型の文字列においても、StringオブジェクトのインスタンスメソッドであるtoUpperCaseメソッドを呼び出せます。"STRING"プリミティブ型である文字列がStringのインスタンスメソッドを呼び出せるのは一見不思議です。この章では、プリミティブ型の値がなぜオブジェクトのメソッドを呼び出せるのかについて解説します。文字列(String)、シンボル(Symbol)にはそれぞれ対応するオブジェクトが存在します。文字列に対応するオブジェクトとして、Stringオブジェクトがあります。このStringオブジェクトをnewすることでStringオブジェクトのインスタンスを作れます。VALUE"このようにインスタンス化されたものは、プリミティブ型の値を包んだ(ラップした)オブジェクトと言えます。そのため、このようなオブジェクトをプリミティブ型の値に対してのラッパーオブジェクトと呼びます。ラッパーオブジェクトとプリミティブ型の対応は次のとおりです。undefinedとnullに対応するラッパーオブジェクトはありません。注意点として、ラッパーオブジェクトは名前のとおりオブジェクトです。そのため、次のようにtypeof演算子でラッパーオブジェクトを見ると"object"です。"object"プリミティブ型の値からラッパーオブジェクトへの自動変換JavaScriptでは、プリミティブ型の値に対してプロパティアクセスするとき、自動で対応するラッパーオブジェクトに変換されます。String("string")のようなラッパーオブジェクトへ変換されています。これにより、プリミティブ型の値である文字列がStringのインスタンスメソッドを呼び出せるようになります。String(str)).toUpperCase();一方、明示的に作成したラッパーオブジェクトからプリミティブ型の値を取り出すこともできます。ラッパーオブジェクト.valueOfメソッドを呼び出すことで、ラッパーオブジェクトから値を取り出せます。次のように文字列のラッパーオブジェクトからvalueOfメソッドで文字列を取り出せます。"文字列"このように、プリミティブ型の値からラッパーオブジェクトへの変換は自動的に行われます。1JavaScriptには、リテラルを使ったプリミティブ型の文字列とラッパーオブジェクトを使った文字列オブジェクトがあります(真偽値や数値についても同様です)。この2つを明示的に使い分ける利点はないため、常にリテラルを使うことを推奨します。理由として次の3つが挙げられます。String("string")のようにラッパーオブジェクトのインスタンスを扱う利点がないためラッパーオブジェクトをtypeof演算子で評価した結果が、プリミティブ型ではなく"object"となり混乱を生むためこれらの理由などから、プリミティブ型のデータにはリテラルを使います。常にリテラルを使うことでラッパーオブジェクトを意識する必要がなくなります。String("文字列");まとめこの章では、プリミティブ型の値がなぜメソッド呼び出しできるのかについて解説しました。その仕組みの背景にはプリミティブ型に対応したラッパーオブジェクトの存在があります。プリミティブ型の値のプロパティへアクセスする際に、自動的にラッパーオブジェクトへ変換されることでメソッド呼び出しなどが可能となっています。「JavaScriptはすべてがオブジェクトである」と言われることがあります。プリミティブ型はオブジェクトではありませんが、プリミティブ型に対応したラッパーオブジェクトが用意されています(nullとundefinedを除く)。そのため、「すべてがオブジェクトのように見える」というのが正しい認識となるでしょう。このようなプリミティブ型からオブジェクト型への変換はボックス化(ボクシング)、逆にオブジェクト型からプリミティブ型への変換はボックス化解除(アンボクシング)と呼ばれます。