コンテンツにスキップ

JavaScript/自動ボクシング

出典: フリー教科書『ウィキブックス(Wikibooks)』

自動ボクシング

[編集]

自動ボクシング (Auto-Boxing) は、JavaScriptにおいてプリミティブ型の値が必要に応じて一時的にラッパーオブジェクト型に変換される仕組みを指します。このプロセスにより、プリミティブ型の値であっても、オブジェクトとしてのメソッドプロパティにアクセスできるようになります。

自動ボクシングの仕組み

[編集]

JavaScriptエンジンは、プリミティブ型の値に対してオブジェクトのメソッドやプロパティを呼び出そうとした際に、以下の手順で自動的にラッパーオブジェクトを生成します。

  1. プリミティブ型の値を対応するラッパーオブジェクト型 (StringNumberBoolean など) に変換する。
  2. 必要なメソッドプロパティにアクセスする。
  3. 処理が完了した後、一時的に生成されたラッパーオブジェクトを破棄する。

使用例

[編集]

以下の例は、文字列のプリミティブ型である"hello"が自動的にラッパーオブジェクト型に変換されて処理されることを示しています。

// プリミティブ型の文字列
const str = "hello";

// Stringオブジェクトのメソッドが呼び出される際に自動ボクシングが行われる
console.log(str.toUpperCase()); // "HELLO"

この例では、str.toUpperCase() の呼び出し中に、str は一時的に String オブジェクトに変換されています。

対応するラッパーオブジェクト型

[編集]

自動ボクシングが適用される主なプリミティブ型と、そのラッパーオブジェクト型は以下の通りです。

  • String: プリミティブ型の文字列 ("example") をラップします。
  • Number: プリミティブ型の数値 (42) をラップします。
  • Boolean: 真偽値 (true または false) をラップします。

手動でのラッパーオブジェクトの生成

[編集]

自動ボクシングではなく、明示的にラッパーオブジェクトを生成することも可能です。ただし、これは非推奨とされています。

// 手動でStringオブジェクトを生成
const explicitString = new String("hello");
console.log(typeof explicitString); // "object"

明示的に生成されたオブジェクトはプリミティブ型ではなく、オブジェクトとして扱われるため、比較時に予期せぬ挙動を引き起こす可能性があります。

注意点

[編集]
  1. パフォーマンスへの影響:
    自動ボクシングは一時的なラッパーオブジェクトを生成するため、大量の操作を行う場合にはパフォーマンスに影響を与えることがあります。
  2. 型の不一致:
    自動ボクシングによる一時的な変換は、プリミティブ型とラッパーオブジェクト型の違いを意識しない場合に混乱を招く可能性があります。
    const str1 = "hello";
    const str2 = new String("hello");
    console.log(str1 === str2); // false
    
  3. 非推奨な使用方法の回避:
    明示的なラッパーオブジェクトの生成は、通常の使用において避けるべきです。

自動ボクシングとアンボクシング

[編集]

自動ボクシングに対応して、ラッパーオブジェクトからプリミティブ型への変換を「アンボクシング」と呼びます。アンボクシングは、valueOf() メソッドを使用して手動で行うことも可能です。

const wrappedNumber = new Number(42);
console.log(wrappedNumber.valueOf()); // 42

まとめ

[編集]
  • 自動ボクシングは、プリミティブ型の値を一時的にラッパーオブジェクト型に変換する仕組みです。
  • ラッパーオブジェクト型を明示的に使用する必要はほとんどありません。
  • 型の不一致やパフォーマンスへの影響に注意して使用することが重要です。