LoginSignup
15
5

More than 3 years have passed since last update.

JavaScriptのオブジェクトには、2つ意味がある

Last updated at Posted at 2020-01-02

概要

JavaScriptの世界で、「オブジェクト」は重要なキーワード。であると同時に、指し示す範囲が曖昧で、よく観察すると文脈によって少し違う意味で使われていたりする。この違いを整理してみたい。

ざっくり言うと、オブジェクトには広義のオブジェクトと狭義のオブジェクトがある(これは正式な呼び方ではない)。一般にオブジェクトというときは広義の意味で使われていることが多いが、チュートリアルなどでは最初に狭義の方が出てくるケースもよくあるので、初心者のうちはややこしいと思う。

2つの意味をそれぞれ簡潔にまとめると、以下のようになる。

広義のオブジェクト:プロパティとメソッドを持つデータ構造(データと機能をひとまとめにしたもの)

狭義のオブジェクト:連想配列、Objectオブジェクト

図で書くと、こんな感じ。

Group 1.png

つまり、広義のオブジェクトの中にStringオブジェクトやArrayオブジェクトなど、いろいろな種類があって、その一つが狭義のオブジェクトであるObjectオブジェクトという構図になっている。日常的な例でいうと「ごはん」という言葉に広義のごはん(食事)があって、その中に狭義のごはん(炊いた米)が含まれるというのと似ているかも。

広義のオブジェクト

それぞれのカテゴリについて詳しく見ていくと、まず広義のオブジェクトは以下のような共通点を持つデータ構造のことと言える。

newキーワードで作れる

よく使われるのはnew Date()でDateオブジェクトを作るというもので、たとえば、現在日時を表すdという変数を作りたいなら

const d = new Date();

とすればいい。

また、これと同じように

const str = new String('hello');

としてstrというStringオブジェクト(≒ 文字列)を作ることができる。この書き方で文字列を作るのは推奨されていないが、単にconst str = 'hello';と書く代わりに、このような表現もできることは覚えておいていいと思う。

続けて.プロパティ名.メソッド名と書くと、値や関数にアクセスできる

例として、

const arr = [24, 18, 35];

のような配列があった場合を考えよう。配列はArrayオブジェクトとも呼ぶことができて、上の[24, 18, 35]の部分はnew Array(24, 18, 35)とも書ける。そして、この配列(= Arrayオブジェクト)の要素数の情報はlengthプロパティとしてアクセス可能になるので

arr.length

とすれば、arrにいくつ要素が格納されているか調べられる。

また、上の例で作ったdの3分後を表すDateオブジェクトが欲しいときは、分の値を設定するsetMinutes()メソッドと分の値を取得するgetMinutes()メソッドを使って

d.setMinutes(d.getMinutes() + 3);

と書けばいい。

狭義のオブジェクト

一方、狭義のオブジェクトつまりObjectオブジェクトは、上で説明した一般的なオブジェクトの機能に加えて、いくつか独自の機能を兼ね備えたオブジェクトを指す。

最も特徴的なのは、オブジェクトを作るときに

{suzuki: 47, sato: 38}

のように波括弧{}とセミコロンを使って、自分でプロパティを設定できる点かと思う。Objectオブジェクトは、このようなプロパティの名(上の例でいうとsuzukisato)をキーとして、プロパティの値(上の4738)にアクセスできることから、連想配列とも呼ばれている。

ただ、Objectオブジェクトは広義のオブジェクトの一つでもあるので、Dateオブジェクトなどと同じようにnewキーワードを使って生成できたりする。たとえば、

const obj = new Object();

とすると、

const obj = {};

と書いたのと同じ意味になる。new Object()new Array()などと同様に使う機会は少ないが、以上のような例から、Objectオブジェクトも配列(= Arrayオブジェクト)も広い意味で「オブジェクト」の仲間、という感覚が掴めればよいと思う。

ちなみに、JavaScriptのObjectオブジェクト(= 連想配列)に当たるデータ構造には、他の言語だともう少し分かりやすい名前がついていることが多く、たとえばRubyにはハッシュ、Pythonにはディクショナリという概念がある。JavaScriptにも、そういう用語があったらもっと分かりやすい気がするのだけど…。

15
5
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
5