ラッパーオブジェクトとプリミティブ型

JavaScript のデータ型の中でプリミティブ型に含まれる数値や文字列はオブジェクトではありませんが、それぞれ対応するラッパーオブジェクトが用意されておりあたかもオブジェクトのようにプロパティを参照したりメソッドを実行したりすることができます。ここでは JavaScript におけるラッパーオブジェクトとプリミティブ型の関係について解説します。

(Last modified: )

ラッパーオブジェクトとは

JavaScript のデータ型は大きくわけてプリミティブ型とオブジェクト型に分けることができ、プリミティブ型には次の 7 種類があります。

数値
長整数
文字列
論理値
undefined
null
シンボル

※ JavaScript のデータ型に関して詳しくは「JavaScriptのデータ型」を参照してください。

この中の undefined と null を除いたものに対してはそれぞれラッパーオブジェクトが用意されています。

プリミティブ型ラッパーオブジェクト
数値Number
長整数BigInt
文字列String
論理値Boolean
シンボルSymbol

オブジェクトではないプリミティブ型の数値や文字列にはメソッドなどは用意されていませんが、プリミティブ型の値に対して対応するラッパーオブジェクトで用意されているメソッドを呼び出すと、自動的にプリミティブ型の値が対応するラッパーオブジェクトに変換され、その上でラッパーオブジェクトのメソッドが呼び出されます。

次のサンプルではプリミティブ型のひとつである数値にに対して、対応するラッパーオブジェクトの Number オブジェクトのメソッドを呼び出しています。

let num = 17;

console.log(num.toString(2));
>> 10001

これは次のようにプリミティブ型の値からラッパーオブジェクトのオブジェクトを作成してメソッドを呼び出しているのと同じです。

let num = 17;
let obj = new Number(num);

console.log(obj.toString(2));
>> 10001

このようにラッパーオブジェクトが用意されているおかげで、プリミティブ型であってもあたかもオブジェクトのように扱うことができます。ラッパーオブジェクトへの変換は自動で行われるので、特に明確な理由がなければラッパーオブジェクトのオブジェクトを作成するのではなく、プリミティブ型のリテラルに対して直接メソッドを呼び出したりプロパティを参照するようにされてください。

ラッパーオブジェクトに関する注意点

ラッパーオブジェクトである Number オブジェクトや String オブジェクトはそれ自身でオブジェクトを作成することができます。

let numObj = new Number(10);

作成された Number オブジェクトはオブジェクトであり、プリミティブ型の数値とは異なります。データ型を調べる typeof 演算子の引数に数値を指定すると number を返すのにたいして、 Number オブジェクトを指定すると object を返します。

let num = 10;
console.log(typeof num);
>> number

let numObj = new Number(num);
console.log(typeof numObj);
>> object

console.log(num === numObj);
>> false

プリミティブ型の値は、必要に応じて自動的に対応するラッパーオブジェクトに変換されますが、ラッパーオブジェクトはオブジェクト型のひとつでありプリミティブ型とは基本的に異なる点に注意してください。

なお new 演算子を使用せずに次のように記述すると、対応するプリミティブ型の値が作成されます。

let num = Number(10);
console.log(typeof num);
>> number

-- --

JavaScript におけるラッパーオブジェクトとプリミティブ型の関係について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。