JavaScriptのプリミティブ型とオブジェクト型って?

最近写経をはじめました。 そこでの気づきや学びを備忘録としてここに残していきます。 おかしなところがあればご指摘ください。

写経する教材はこちらになります。

www.oreilly.co.jp

今回はJavaScriptプリミティブ型オブジェクト型についてです。

プリミティブ型とオブジェクト型

JavaScriptでの値はプリミティブ型オブジェクト型のふたつになります。 プリミティブという言葉の意味は調べると 『原始的、素朴な、幼稚な』といった意味がでてきます。

具体的にプリミティブを表現するデータ型は6つあります。

  • 数値(Number)
  • 文字列(String)
  • 論理値
  • null
  • undefined
  • シンボル(Symbol)

※シンボルはES2015から新しく導入されました。

プリミティブ型の例

プリミティブ型を判別するためにtypeof演算子を使います。

typeof 123 // 'number'
typeof "hoge" // 'string'
typeof true // 'boolean'
typeof null // 'object'
typeof undefined // 'undefined'

nullの型がobjectとなってしまっています。nullはプリミティブ型です。 これは修正すべきだと提案はされているみたいなのですが、依存するコードが多く、いまだに言語仕様として残ってしまっているみたいです。

一方で以下がオブジェクト型の例です。

プリミティブ型は一つの値しか表現できず、不変です。一方でオブジェクトはプロパティやメソッドなどで値を変化させることができます。

オブジェクト型の例

typeof {} // "object''
typeof [] // "object"
typeof new Date() // "object"
typeof new RegExp() // "object"
typeof new Map() // "object"

そこで自分はふと思いました。

プリミティブ型でもプロパティやメソッド使っているよな?と。

例えば文字列についてです。

const str = "あいうえお";
const strNum  = str.length;
console.log(strNum) // 5 

あれ? プリミティブ型ってメソッドもプロパティもっているじゃん! この疑問を解消してくれるのがラッパーオブジェクトです。

プリミティブ型のデータの中で

  • 数値
  • 文字列
  • 真偽値

などはそれぞれ対応するオブジェクトがあります。

// String
const str = new String("あいうえお");
console.log(str.length); // 5

// Number
const num = new Number(9);
num.toString()
console.log(num) // "9"

// Boolean
const bool = new Boolean(true)
bool.hasOwnProperty() // false

このように初期化されたものは、プリミティブ型を内包したオブジェクトといえます。 このようなオブジェクトのことをラッパーオブジェクトと言います。

お気付きの方もいるかもしれませんが、上の例ではnewをしていないのにも関わらずstr.lengthといった形でlengthメソッドを使い文字数を出力しています。

結論を言うとラッパーオブジェクトへの変換は自動的にしてくれているようです。 プリミティブ型に対応するラッパーオブジェクトのプロパティやメソッドにアクセスすると一時的にラッパーオブジェクトに変換してくれるようです。

まとめ

普段なんとなく使っているプログラムもこのような仕組みを知ることで言語仕様への理解が少し深まりました。他の言語のRubyにはプリミティブ型はないのか?など比較をする基準ができるため今後も写経を続けていこうと思います。