JavaScriptのプリミティブ型とオブジェクト型って?
最近写経をはじめました。 そこでの気づきや学びを備忘録としてここに残していきます。 おかしなところがあればご指摘ください。
写経する教材はこちらになります。
今回は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にはプリミティブ型はないのか?など比較をする基準ができるため今後も写経を続けていこうと思います。