📝

[javascript学習]プリミティブ型とラッパーオブジェクト

2022/10/19に公開約1,300字

jsではプリミティブ型それぞれに対応するオブジェクトがある。

例えばStringをnewするとStringオブジェクトのインスタンスが作れる。

const str = new String("input value");

コンソールでstrを表示させるとこうなる

String {'input value'}
0: "i"
1: "n"
2: "p"
3: "u"
4: "t"
5: " "
6: "v"
7: "a"
8: "l"
9: "u"
10: "e"
length: 11[[Prototype]]: String[[PrimitiveValue]]: "input value"

文字列が配列として格納されている。

str[0]; //'i'
str[3]; //'u'

プリミティブ型を包み込む格好になることからラッパーオブジェクトと呼ばれる

ちなみに、上のやり方でなくプリミティブ型の変数からでも、Stringオブジェクトのメソッドが使える。

const str = 'value'
str.toUpperCase() // VALUE

プリミティブ型から型に対応するオブジェクトのメソッドを呼び出せるようになっているためらしい。

JavaScriptでは、プリミティブ型の値に対してプロパティアクセスするとき、自動で対応するラッパーオブジェクトに変換されます。 たとえば"string"
という文字列は、自動的にnew String("string")
のようなラッパーオブジェクトへ変換されています。 これにより、プリミティブ型の値である文字列がString
のインスタンスメソッドを呼び出せるようになります。

変数strそのものはラッパーオブジェクトではない。呼出時にラッパーオブジェクトに変換しているよう。

typeof str //'string'

公式では、ラッパーオブジェクトをわざわざ利用することは推奨していない。

JavaScriptには、リテラルを使ったプリミティブ型の文字列とラッパーオブジェクトを使った文字列オブジェクトがあります(真偽値や数値についても同様です)。 この2つを明示的に使い分ける利点はないため、常にリテラルを使うことを推奨します。 理由として次の3つが挙げられます。

  • 必要に応じて、プリミティブ型の文字列は自動的にラッパーオブジェクトに変換されるため
  • new String("string")のようにラッパーオブジェクトのインスタンスを扱う利点がないため
  • ラッパーオブジェクトをtypeof演算子で評価した結果が、プリミティブ型ではなく"object"となり混乱を生むため

これらの理由などから、プリミティブ型のデータにはリテラルを使います。 常にリテラルを使うことでラッパーオブジェクトを意識する必要がなくなります。

参考
https://jsprimer.net/basic/wrapper-object/

Discussion

ログインするとコメントできます