JavaScriptにおけるラッパーオブジェクト
この記事ではJavaScriptにおけるラッパーオブジェクトについて説明します。
YouTube Video
ラッパーオブジェクト
JavaScriptには、プリミティブ型とそれを扱うためのオブジェクト(ラッパーオブジェクト)があります。
プリミティブ型
プリミティブ型は単一の値を表すデータ型で、シンプルで軽量です。これらはイミュータブル(変更不可)で、直接オブジェクトのメソッドやプロパティを持ちませんが、一時的にラッパーオブジェクトに変換されることで操作が可能です。
string
やnumber
などはプリミティブ型です。一方、ラッパーオブジェクトはString
やNumber
のように最初が大文字になります。
ラッパーオブジェクト
プリミティブ型を操作するために、JavaScriptは一時的にラッパーオブジェクト(Object
ラッパー)を生成します。ラッパーオブジェクトには、プリミティブ型に対するメソッドやプロパティが含まれています。
Number
1let numObject = new Number(42); // Wrapper object
2
3console.log(typeof numObject); // object
4console.log(numObject.valueOf()); // 42
5
6let numValue = Number(42); // Return primitive value
7
8console.log(typeof numValue); // number
9console.log(numValue); // 42
Number
はプリミティブなnumber
をラップするオブジェクト型です。Number
オブジェクトを明示的に作成することで、number
のように数値を扱えますが、通常はプリミティブなnumber
型を使うことが推奨されます。
typeof numObject
は"object"
ですが、typeof 42
は"number"
です。
new
演算子をつけて新たにラッパーオブジェクトを生成した場合と、Number
を関数として呼び出した場合で結果が異なることにも注意してください。関数として呼び出した場合には、プリミティブ型のnumber
が返されます。
String
1let strObject = new String("Hello"); // Wrapper object
2
3console.log(typeof strObject); // object
4console.log(strObject.valueOf()); // Hello
- プリミティブな
string
をラップするオブジェクト型です。String
オブジェクトを使うことで文字列のプロパティやメソッドにアクセスできますが、通常はプリミティブなstring
を使用します。
typeof strObject
は"object"
ですが、typeof "Hello"
は"string"
です。
Number
と同様に、String
を関数として呼び出した場合にはプリミティブ型のstring
が返されます。
Boolean
1let boolObject = new Boolean(true); // Wrapper object
2
3console.log(typeof boolObject); // object
4console.log(boolObject.valueOf()); // true
- プリミティブな
boolean
をラップするオブジェクト型です。Boolean
オブジェクトを明示的に作成することもできますが、通常はプリミティブなboolean
型を使用します。
typeof boolObject
は"object"
ですが、typeof true
は"boolean"
です。
Number
と同様に、Boolean
を関数として呼び出した場合にはプリミティブ型のboolean
が返されます。
BigInt
1let bigIntObject = Object(9007199254740991n); // Wrapper object
2
3console.log(typeof bigIntObject); // object
4console.log(bigIntObject.valueOf()); // 9007199254740991n
5
6let bigIntValue = BigInt(9007199254740991); // Return primitive BigInt
7
8console.log(typeof bigIntValue); // bigint
9console.log(bigIntValue); // 9007199254740991n
10
11// Error
12let bigIntObject2 = new BigInt(9007199254740991n);
Object
を使ってBigInt
のラッパーオブジェクトを生成できますが、通常はプリミティブ型のbigint
を直接使うのが一般的です。
typeof bigIntObject
は"object"
であるのに対し、typeof 9007199254740991n
は"bigint"
です。
BigInt
を関数として呼び出すとプリミティブなbigint
を返しますが、new
演算子をつけてBigInt
のラッパーオブジェクトを生成することはできません。
Symbol
1let symObject = Object(Symbol("id")); // Wrapper object for Symbol
2
3console.log(typeof symObject); // object
4console.log(symObject.valueOf()); //
Object
を使ってSymbol
のラッパーオブジェクトを生成できますが、通常はSymbol
プリミティブ型をそのまま使用します。
プリミティブ型とラッパーオブジェクトの違い
- プリミティブ型は軽量で、メモリ効率が良い一方、直接プロパティやメソッドは持ちません。しかし、JavaScriptはプリミティブ型を使っても、必要なときに自動的に一時的なラッパーオブジェクトを生成してメソッドやプロパティを提供します。
1let text = "Hello";
2
3// A temporary String object is created,
4// allowing access to the length property
5console.log(text.length);
- ラッパーオブジェクトは明示的に生成されたオブジェクトであり、メモリやパフォーマンスに影響を与えるため、通常はプリミティブ型を使うことが推奨されます。
まとめ
- プリミティブ型:
number
、string
、boolean
、null
、undefined
、symbol
など、軽量で直接のメソッドを持ちません。 - ラッパーオブジェクト:
Number
、String
、Boolean
など、プリミティブ型に一時的に変換されるオブジェクトです。
YouTubeチャンネルでは、Visual Studio Codeを用いて上記の記事を見ながら確認できます。 ぜひYouTubeチャンネルもご覧ください。