※当方駆け出しエンジニアのため、間違っていることも多々あると思いますので、ご了承ください。また、間違いに気付いた方はご一報いただけると幸いです。
#JavaScript におけるデータは「すべてオブジェクトである」
と、いうふうに聞いたことがある。
しかし、学習を進める上で
**「データ型のうちObjectはオブジェクト型、それ以外をプリミティブ型という。」**とのことで、矛盾していないか?との思いがよぎった。
詳しくはこちら
【JavaScript】JavaScriptにおける変数の参照について
その答えが、**「ラッパーオブジェクト」**であった。
例えば、以下のような式があるとする。
let str = "name";
let big = str.toUpperCase();
console.log(big);
//NAME
toUpperCase()関数は、呼び出し元の文字列を大文字にして返却する関数であるが、なぜプリミティブ型のであるstring型のstrが関数を呼べるのか。
実際、下記の様にデータ型を調べてみると、
console.log(typeof str);
//string
string型である。
この理由はJavaScriptの**「ラッパーオブジェクトの自動変換」**という機能にある。
ラッパーオブジェクトというのは、本来オブジェクト型でない値を、オブジェクトで包んで(ラップして)オブジェクトとしての振る舞いを持たせるというものである。
つまり、
str.toUpperCase();
この様に、string型のデーターに対し、オブジェクトとしての振る舞いを要求された時は、ラッパーオブジェクトで自動的に包んで、実行されるのである。
str.toUpperCase();
この時
(new String(str)).toUpperCase();
この様に自動的に、string型に対応するオブジェクトであるStringからインスタンスが作成され、関数を呼び出している。(Stringオブジェクトは、toUpperCaseメソッドを保有している。)
実際、開発者はこの自動変換を意識せずともコードは書くことができるので、string型もオブジエクとして扱うことができる。
つまり
###JavaScript におけるデータは「すべてオブジェクトである」のではなく、ラッパーオブジェクトのおかげで、「全てのデーターはオブジェクトのように振舞うことができる」と言うことなんですね。