このシリーズはプリミティブ型、オブジェクト型についての詳しい内容についてもそれぞれ記事を作成し、全3回の構成になる予定です。
結論
- JavaScript は弱い型付け、動的型付けの特徴を持つ
- プリミティブ型は変更ができない
- プリミティブ型に分類されるのは以下の7つ:
- String
- Number
- BigInt
- Boolean
- undefined
- Symbol
- null
- オブジェクト型は変更ができる
- オブジェクトに分類されるのは以下の(大きな分類で)7つ:
- Object
- Date
- Array
- 型付き配列
- Function
- インデックス付きコレクション
- キー付きコレクション
- Map
- WeakMap
- Set
- WeakSet
JavaScript の型の性質
JavaScript は弱い型付けあるいは動的型付けの言語です。JavaScript では、変数が直接的に特定のデータ型に関連付けられているわけではなく、どの変数にもあらゆる型の値を代入 (および再代入) することができます。
JavaScript のデータ型とデータ構造 - JavaScript | MDN
弱い型付け
対義語は「強い型付け」。言葉自体の定義が曖昧であるとのことだったので詳しくは調べませんでした。
推測ですが、後述するように JavaScript では暗黙的な型変換(String + Number = String など)が行われるため、弱い型付けと言えるのかなと思います。
動的型付け
対義語は「静的型付け」。
静的型付けではコンパイル時に変数の型が決まっており、規定以外の値を代入していればそもそも実行がされません。
対して動的型付けでは実行時まで変数の方が分からず、想定外の型をうっかり代入してしまっても実行結果を見るまで気づきません。
JavaScript の場合は暗黙的な型変換が行われるため、「数値計算をする関数のはずなのに文字列結合が起こってしまった…」というようなことが起こり得ます。
function sum(num1, num2) {
return num1 + num2;
}
console.log(sum("1", 2)); // -> 12
プリミティブとオブジェクトとは
JavaScript の型はプリミティブとオブジェクトに大別できます。
プリミティブとは
JavaScript において、プリミティブ (primitive、プリミティブ値、プリミティブデータ型) はオブジェクトでなく、メソッドを持たないデータのことです。
(中略)
すべてのプリミティブ値は、イミュータブル (immutable) 、つまり変更できません。変数には新しい値を再割り当てすることができますが、既存の値については、オブジェクト、配列、関数が変更できるのに対して、プリミティブ値は変更することができません。
プリミティブ型の値をプリミティブ値と言います。
プリミティブに分類されるデータ型は以下の7つ。
- String
- Number
- BigInt
- Boolean
- undefined
- Symbol
- null
プリミティブ = 原始的、という言葉の通りなのか、プリミティブ型の値は変更ができません。 let
宣言を使った場合は当然、変数に新しい値を再割り当てできます。しかし 値自体に何か変更を加える ことはできないのです。
オブジェクトであれば後から value を変更したり、プロパティを追加したりできます。
また関数宣言で作成した関数は同じスコープで同名のものを2つ宣言してもエラーにはなりません。ファイルの下に書かれた関数が上の関数を上書きします。
function greet() {
console.log("Good morning");
}
greet(); // -> "Sleep tight"
function greet() {
console.log("Sleep tight");
}
greet(); // -> "Sleep tight"
オブジェクトとは
JavaScript では、オブジェクトはプロパティの集合として見ることができます。オブジェクトリテラル構文は、初期化される限定された一連のプロパティです。その後でプロパティは追加したり削除したりすることができます。プロパティのキーは、文字列またはシンボルのどちらかです。プロパティの値は、他のオブジェクトを含め、どのような種類の値でもよいので、複雑なデータ構造を構築することが可能です。
JavaScript のデータ型とデータ構造 - JavaScript | MDN
つまり以下のような内容でしょうか。
- オブジェクトは「プロパティ」がたくさん集まって構成されている
- オブジェクトを最初に宣言した時に入れたプロパティはあくまで「初期化」= 最初の状態であり、追加や変更ができる
- キーは文字列またはシンボル
- 値はなんでも良い
オブジェクトに分類されるのは以下の(大きな分類で)7つ。
- Object
- Date
- Array
- 型付き配列
- Function
- インデックス付きコレクション
- キー付きコレクション
- Map
- WeakMap
- Set
- WeakSet
関数にはあまりオブジェクトであるというイメージはありませんが、呼び出すことができるという機能を持ったオブジェクトだそうです。
まとめ
- JavaScript は弱い型付け、動的型付け
- プリミティブ型は変更ができない
- プリミティブ型に分類されるのは以下の7つ:
- String
- Number
- BigInt
- Boolean
- undefined
- Symbol
- null
- オブジェクト型は変更ができる
- オブジェクトに分類されるのは以下の(大きな分類で)7つ:
- Object
- Date
- Array
- 型付き配列
- Function
- インデックス付きコレクション
- キー付きコレクション
- Map
- WeakMap
- Set
- WeakSet
編集後記
実は以前にも似た記事を書いたことがあったのですが、MDN を読み返すと内容が少し変わっていたので改稿しました。
間違っている部分・時代にそぐわない部分がありましたらご指摘お待ちしています!