JavaScript: オブジェクトとは
気になった理由
前回、LeetCodeの問題を解いた時に、オブジェクトを作った方が簡単だったということに気づいた。
{}
使うのがオブジェクトだろうくらいのなんとなくの理解しかなかった。ここでちゃんと理解しておこう。
前回の記事
LeetCode #Roman to Integerやってみた
私のコード
// 1. 文字を数値に変換
for (let i = 0; i < s.length; i++) {
if (s[i] === 'I') {
num_array.push(1);
} else if (s[i] === 'V') {
num_array.push(5);
} else if (s[i] === 'X') {
num_array.push(10);
} else if (s[i] === 'L') {
num_array.push(50);
} else if (s[i] === 'C') {
num_array.push(100);
} else if (s[i] === 'D') {
num_array.push(500);
} else if (s[i] === 'M') {
num_array.push(1000);
}
}
ChatGPTが提案したコード
const symbolToValue = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000
};
symbolToValue['I']; => 1
ローマ数字を整数に変換するパターンをオブジェクトで作成している。
参考にした書籍
-
JavaScript Primer 迷わないための入門書 の「第12章:オブジェクト」の「プロパティの存在確認」の前まで
JavaScriptのオブジェクトとは何かを理解するために使用しました。 -
オブジェクト指向でなぜつくるのか 第3版 知っておきたいOOP、設計、アジャイル開発の基礎知識 の第1章
そもそもオブジェクトを使うことがどうしていいのかを理解するために使用しました。
JavaScriptのオブジェクトとは
何がオブジェクトになる?
配列、関数、クラス、正規表現、Date等、プリミティブ型ではないデータをオブジェクトとするそうです。JavaScriptでは、それらのオブジェクトは、Objectというビルトインオブジェクトを元にしています。ビルトインオブジェクトとは、ECMAScriptの仕様で定義され、実行環境にあらかじめ定義されているオブジェクトのこと言います。
ここから説明するオブジェクトは、そのビルトインオブジェクトのことだと思ってください。
どうやってオブジェクトは作られる?
オブジェクトはプロパティの集合です。プロパティとは名前 (キー)と値(バリュー)が対になったものです。
オブジェクトの基本形
const obj = {
//キー:値
"key": "value"
};
オブジェクトが持つキーのことを、プロパティ名と言います。ここでは、objというオブジェクトは、keyというプロパティ名とそれに対応する"value"というプロパティ値を持っていると言えます。
プロパティへのアクセス方法
2つのアクセス方法があります。
- ブランケット記法
- ドット記法
const obj = {
key: "value"
};
// ブランケット記法
console.log(obj["key"]); // => "value"
// ドット記法
console.log(obj.key); // => "value"
ブランケット・ドット記法の使い分け
ドット記法では、プロパティ名が、変数名をつける時と同じ命名規則に従っている場合のみに使うことができます。
obj.key; //OK
//数字から始まる識別子はだめ
obj.123; //NG
//ハイフンを含んでいたらダメ
obj.my-prop; //NG
また、ドット記法ではプロパティ名に変数を使えません。
// ブランケット記法では変数をプロパティ名に利用できる。
const languages = {
ja: "日本語",
en: "英語"
};
const myLang = 'ja';
console.log(languages[myLang]; // => "日本語"
結論として、
基本的には簡潔なドット記法(.)を使い、ドット記法で書けない場合はブランケット記法([])を使うとよいでしょう。
分割代入
オブジェクトのプロパティを変数として定義し直すときには、分割代入(Destructuring assignment)が利用できます。
ドットやブランケット記法でいちいち書いていたらめんどくさいから。
const languages = {
ja: "日本語",
en: "英語"
};
const {ja, en} = languages;
console.log(ja); // "日本語"
console.log(en); // "英語"
オブジェクトは、mutable
オブジェクトは、一度作成した後もその値自体を変更できます。
しかし、いろんな場所で容易に変更しちゃうとよくわかんなくなるから、基本的には以下を意識するといいかも。
プロパティを初期化時以外に追加してしまうと、そのオブジェクトがどのようなプロパティを持っているのかがわかりにくくなります。そのため、できる限り作成後に新しいプロパティは追加しないほうがよいでしょう。
const で定義しても、オブジェクトは変更可能
javascriptのconstは、値を固定するものではなく、変数への再代入を防ぐためのもの。
const obj = {key: "value"};
obj.key = "Hi!"; //変更可能
console.log(obj.key); // => 'Hi!'
// objという変数への再代入はできない
obj = {}; // => TypeError
オブジェクトだとどうしていいの?
第1章しか読んでいないので、もっと深ぼる必要がありますが、ざっっくりまとめると、
「個々の機能の独立性を高めて、保守や再利用がしやすくなる」
今後また読み進めて、まとめてみたいと思います。
今回の私のコードの反省
- 一度ローマ数字を整数に変換した後、その後の処理の中でその変換処理はもうできない。(→ 再利用できない)
- 可読性が低い。コードが長い。(保守が難しい)
- 入力を変換する処理のため、入力の値に依存している。(=>独立性がない)
Discussion