オブジェクトの基本 — 作る・読む・書き換える

オブジェクトは名前を付けて値をまとめる入れ物です。作り方、ドットと角括弧の使い分け、無い鍵を読んだときの結果、あるかどうかの調べ方、同じものを指すという性質までを確かめます。

実行して検証済み処理系Node 22.22.3対応ES1難易度○○○○目安9更新

オブジェクトは、値に名前を付けてまとめる入れ物です。 配列が順番で管理するのに対して、オブジェクトは名前で管理します。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
{ name: 'あ', age: 20 } object
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
あ あ

名前: 値 の組を , で区切って並べます。この組ひとつをプロパティと呼び、 名前の側を、値の側をと呼びます。

読む

書き方は2つあります。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
undefined
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
20 あ い [ 'name', 'age', 'full name' ]
  • user.nameふだんはこちら。 短くて読みやすい
  • user['name'] … 鍵を文字列で渡す。変数や、記号を含む名前のときに使う

無い鍵を読んでも落ちない

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
{ name: 'い', age: 20 } { name: 'い' }
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
true true

エラーになりません。 undefined が返るだけです。

配列で範囲の外を読んだときと同じで、間違いに気づきにくい性質です。 → 配列の基本

鍵は文字列

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
true false true
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
true false
  • [key] … 変数の中身を鍵にする(計算プロパティ
  • 'full name' … 空白や記号を含む鍵は引用符で囲む。読むときは角括弧

user.key と書くと、変数の中身ではなく key という名前を探します。 ここは取り違えやすいところです。

書き換える・足す・消す

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
{ name: 'あ', age: 20 }
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8

無い鍵に代入すると、そのまま足されます。 宣言のようなものは要りません。

const で宣言していても、中身は変えられます。 const が固定するのは名前と値の結びつきで、中身ではありません。 → TypeError: Assignment to constant variable.

あるかどうかを調べる

undefined かどうかで判断すると、取り違えることがあります

javascript
const key = 'age';
const user = { name: 'あ', age: 20 };

console.log(user.key);
undefined
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
20

「鍵が無い」と「鍵はあるが値が undefined」を区別できていません。 区別したいなら inObject.hasOwn() を使います。

example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
2 true
example.js
出力書き換えて実行できます
Ctrl+Enter でも実行JS · UTF-8
1 3 false

inObject.hasOwn() の違い

in受け継いだものまで見ます。toString は自分で書いていないのに true です。

自分で持っている鍵だけを見たいなら Object.hasOwn() を使ってください。 利用者の入力を鍵にするときは、この差が事故になります。

Object.hasOwn() は Node 16.9 / Chrome 93 以降。それより前は Object.prototype.hasOwnProperty.call(user, 'name') と書きます。

短く書く

変数名と鍵名が同じなら、片方を省けます。

関数も入れられます。オブジェクトの中の関数をメソッドと呼びます。

this は「呼ばれ方」で決まります。取り出して呼ぶと外れるので注意してください。 → なぜ this は呼び方で変わるのか

よくある間違い

変数を鍵にするつもりでドットを書く

user.key は「key という名前の鍵」を探します。変数の中身は見ません。 落ちないので、undefined が出るまで気づけません。

変数の中身で引きたいなら角括弧です。

代入しても複製されない

ここがいちばん大事な性質です。

b に入ったのは同じオブジェクトを指す矢印で、中身の複製ではありません。 b を触ると a も変わります。

複製したいなら、はっきりそう書きます。

ただしこれも1段だけです。 入れ子の中身は共有されたままになります。 → オブジェクトを結合する

まとめ

  • オブジェクトは名前で値をまとめる。配列は順番
  • 読み方は user.nameuser['name']変数を鍵にするなら角括弧
  • 無い鍵を読んでも落ちないundefined が返る
  • 「無い」と「undefined」は別。区別するなら Object.hasOwn()
  • in は受け継いだ鍵まで見る。 Object.hasOwn() は自分の分だけ
  • 代入は複製ではない。同じものを指す

次に学ぶ

実際のデータは入れ子になっています。 data.user.address.city のように深く辿るときに落ちない書き方と、 必要な値だけ取り出す方法を学びます。

第2回: 入れ子のオブジェクトを安全に扱う

この記事の根拠

  1. Object Objects — ECMAScript® 2026 Language Specificationtc39.es
  2. Object.hasOwn — ECMAScript® 2026 Language Specificationtc39.es
  3. オブジェクトの操作 — MDNdeveloper.mozilla.org

掲載しているコード例は、公開前に読み手が押したときに動くのと同じもので実行して出力を突き合わせています。結果はリポジトリに残しています。

このページの原文(Markdown)