JavaScriptにおけるラッパーオブジェクト

JavaScriptにおけるラッパーオブジェクト

この記事ではJavaScriptにおけるラッパーオブジェクトについて説明します。

YouTube Video

ラッパーオブジェクト

JavaScriptには、プリミティブ型とそれを扱うためのオブジェクト(ラッパーオブジェクト)があります。

プリミティブ型

プリミティブ型は単一の値を表すデータ型で、シンプルで軽量です。これらはイミュータブル変更不可)で、直接オブジェクトのメソッドやプロパティを持ちませんが、一時的にラッパーオブジェクトに変換されることで操作が可能です。

stringnumberなどはプリミティブ型です。一方、ラッパーオブジェクトはStringNumberのように最初が大文字になります。

ラッパーオブジェクト

プリミティブ型を操作するために、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);
  • ラッパーオブジェクトは明示的に生成されたオブジェクトであり、メモリやパフォーマンスに影響を与えるため、通常はプリミティブ型を使うことが推奨されます。

まとめ

  • プリミティブ型numberstringbooleannullundefinedsymbolなど、軽量で直接のメソッドを持ちません。
  • ラッパーオブジェクトNumberStringBooleanなど、プリミティブ型に一時的に変換されるオブジェクトです。

YouTubeチャンネルでは、Visual Studio Codeを用いて上記の記事を見ながら確認できます。 ぜひYouTubeチャンネルもご覧ください。

YouTube Video