はじめに
開眼!JavaScriptを読んだまとめ的な記事です。
オブジェクト
「オブジェクトとは、名前と値を持つプロパティを格納するコンテナにすぎない」
著者も言っていますが、オブジェクトとはただのプロパティを持った箱です。
これ以上も以下もありません。
プリミティブ型
リテラルを使って値を生成したり、new演算子を使用せずにコンストラクタ関数で値を生成した際には、プリミティブ型となります。
// どちらもプリミティブ型
const myString = 1;
const myString2 = String('hello')
プリミティブ型はオブジェクトではありません。
ですが、プリミティブ型でもStringオブジェクトで使用できるメソッドを使用することができます。
何故でしょう。
// オブジェクトを生成
const myString = new String('hello');
console.log(myString.length);
// プリミティブ型を生成
const myString2 = 'hello';
console.log(myString2.length);
どちらも結果は「5」となります。
プリミティブ型の振る舞い
プリミティブ型はオブジェクトとして扱われません。オブジェクトのように扱われるまでは。
上の例で、プリミティブ型に対してlengthを使用した時が、プリミティブ型がオブジェクトのように扱われたタイミングです。
このタイミングで何が行われているのでしょう。
console.log(myString2.length);
ここが呼び出される前まではプリミティブ型として扱われています。
しかし、ここが呼び出されたタイミングで、このプリミティブ型をオブジェクトのように扱うために、JavaScriptがバックグラウンドで補完するラッパーオブジェクト(new String('hello')のような)を生成します。
つまり、下記の2つは同じ意味となります。
const myString = 'hello';
console.log(myString.length)
console.log((new String('hello')).length)
まとめ
つまり、JavaScriptは全ての値がオブジェクトということではありません。
タイトルの通り、JavaScript全ての値がオブジェクトのような振る舞いをするということです。