# オブジェクト型

以下に記述するものがオブジェクト型になります。

## オブジェクト(object)

**オブジェクト**は**プロパティ**の集合体になります。例えば、一つの商品があるとします。

商品は名前と値段等の**プロパティ**を持っています。それを踏まえると以下のように定義できます。

```javascript
let productName = "りんご";
let productPrice = 200;
```

上記のように定義した場合、商品とプロパティの数が多くなった場合、管理が大変になるかと思います。

そう言った場合に、**オブジェクト**として定義すると管理が楽になります。

<pre class="language-javascript" data-title="index.js"><code class="lang-javascript">...
console.log(typeof fruit);

<strong>let product = {
</strong><strong>    name: "りんご",
</strong><strong>    price: 200,
</strong><strong>};
</strong><strong>console.log(product);
</strong></code></pre>

オブジェクトとして定義した際に、`name`や`price`などのプロパティ名を**key(キー)**&#x3068;も言います。

ブラウザにて以下のように確認できるかと思います。

<figure><img src="https://1869761657-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcUBbYqol4PMzZJggiMqV%2Fuploads%2FlTVWTVb0Eay1Ry3RN7DD%2F%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-11-29%2015.17.47.png?alt=media&#x26;token=ddf0e688-e0ff-43bd-aae5-6809b3a9a959" alt=""><figcaption></figcaption></figure>

特定のプロパティの値を変更、取得するには2つの方法があります。

1つ目は、`.`で繋げる方法です。

<pre class="language-javascript" data-title="index.js◎"><code class="lang-javascript">...
console.log(product);
<strong>product.name = 'みかん';
</strong><strong>console.log(product.name);
</strong></code></pre>

2つ目は、`[]`でkeyを指定する方法です。

<pre class="language-javascript" data-title="index.js◎"><code class="lang-javascript">...
console.log(product.name);
<strong>product['price'] = 300;
</strong><strong>console.log(product['price']);
</strong></code></pre>

基本的には、1つ目の方法で記載するのが良いかと思います。しかし、keyを変数として動的に変更したい場合は、2つ目の方法を使うのが良いかと思います。

オブジェクトに関しては、後のセクションにて詳細に説明します。

## 配列(Array)

複数の値を格納したい場合は、**配列**として定義します。

配列として定義する場合は、`[]`の中に値を記載します。

<pre class="language-javascript" data-title="index.js◎"><code class="lang-javascript">...
console.log(product['price']);

<strong>let fruits = ['りんご', 'みかん'];
</strong><strong>console.log(fruits);
</strong></code></pre>

以下のようにブラウザで確認できるかと思います。

<figure><img src="https://1869761657-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcUBbYqol4PMzZJggiMqV%2Fuploads%2FPzlmbBPk4PIRvpnKe8tc%2F%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-11-29%2016.12.10.png?alt=media&#x26;token=9f508c8c-a60a-43b3-9e48-e981b0857c1d" alt=""><figcaption></figcaption></figure>

配列として定義したそれぞれの値は**要素**とよび、それぞれの**要素**には**インデックス**が割り振られます。

**インデックス**は要素の位置を指し示すもので、先頭から0,1,2,3..と割り振られます。

上記の場合だと、`りんご`に0、`みかんに`1とインデックスが割り振られます。このインデックスを利用することで、要素の変更、取得が可能です。インデックスを利用して要素を変更、取得するには、`[]`にてインデックスを指定します。

<pre class="language-javascript" data-title="index.js◎"><code class="lang-javascript">...
console.log(fruits);
<strong>fruits[0] = 'バナナ';
</strong><strong>console.log(fruits[0]);
</strong></code></pre>

配列に要素を追加する場合は、最後のインデックスの次のインデックス(上記の場合は2)を指定することで、追加することができます。

<pre class="language-javascript" data-title="index.js◎"><code class="lang-javascript">...
console.log(fruits[0]);
<strong>fruits[2] = 'パイナップル';
</strong><strong>console.log(fruits);
</strong></code></pre>

配列の要素数を知りたい場合は、`.length`と繋げることで取得することができます。

<pre class="language-javascript" data-title="index.js◎"><code class="lang-javascript">...
console.log(fruits);
<strong>console.log(fruits.length);
</strong></code></pre>

配列に関しても、後のセクションにて詳細に説明します。

## 関数(Function)

同じ処理を複数回使う場合や、処理をグルーピングしてまとめたい場合は、**関数**を定義します。

関数は以下のように`() => {}`を使って定義します。呼び出す場合は、定義した関数名に`()`をつけます。

<pre class="language-javascript" data-title="index.js◎"><code class="lang-javascript">...
console.log(fruits.length);

<strong>const outputProductInfo = () => {
</strong><strong>    console.log('こんにちは');
</strong><strong>    console.log('みかんの値段は100円です');
</strong><strong>};
</strong><strong>outputProductInfo();
</strong></code></pre>

ブラウザにて以下のように確認できるかと思います。

<figure><img src="https://1869761657-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcUBbYqol4PMzZJggiMqV%2Fuploads%2F3GqkPxU7tTC3mfTbic8d%2F%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-11-29%2016.50.50.png?alt=media&#x26;token=bb9669cb-2722-4c9e-989d-2b0897d13ffd" alt=""><figcaption></figcaption></figure>

こちらの関数にて出力される`みかん`と、`100`の部分を変えたいとします。その場合は**引数**を受け取るようにします。引数を受け取るには、`()`の中に受け取った際に格納する変数名を記述し、その変数名を関数内で呼び出すことができます。また、`(バッククォート)`を使用し、` `` `内で、`${変数名}`とすることで、変数を文字列に埋め込むことができます。こちらの構文を**テンプレートリテラル**と言います。

<pre class="language-javascript" data-title="index.js◎"><code class="lang-javascript">...
console.log(fruits.length);

<strong>const outputProductInfo = (productName, productPrice) => {
</strong><strong>    console.log('こんにちは');
</strong><strong>    console.log(`${productName}の値段は${productPrice}です`);
</strong><strong>};
</strong></code></pre>

呼び出しの際には、`()`の中に渡したい値を引数の数だけ記述します。

<pre class="language-javascript" data-title="index.js◎"><code class="lang-javascript">...
const outputProductInfo = (productName, productPrice) => {
    console.log('こんにちは');
    console.log(`${productName}の値段は${productPrice}です`);
};
<strong>outputProductInfo('みかん', 100);
</strong><strong>outputProductInfo('りんご', 150);
</strong><strong>outputProductInfo('パイナップル', 200);
</strong></code></pre>

ブラウザにて以下のように確認できるかと思います。

<figure><img src="https://1869761657-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcUBbYqol4PMzZJggiMqV%2Fuploads%2F2aTIAIiacgJNDZ1wLYQm%2F%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%202023-11-29%2017.03.09.png?alt=media&#x26;token=28e775f2-dd9d-4eb4-a594-ca26f67bd230" alt=""><figcaption></figcaption></figure>

上記の関数は、処理を行うだけの関数ですが、値を返却することができ、その場合は、`return`を記述します。

<pre class="language-javascript" data-title="index.js◎"><code class="lang-javascript">...
outputProductInfo('パイナップル', 200);

<strong>const add = (a, b) => {
</strong><strong>    return a + b;
</strong><strong>};
</strong><strong>console.log(add(1, 2));
</strong></code></pre>

※関数の書き方に関して、`function`を使った書き方があり、機能的に若干の違いがあります。下記の記事にも記載されているのですが、特に理由がない場合は、上記のような**アロー関数**で定義するのが良いかと思います。

{% embed url="<https://typescriptbook.jp/reference/functions/function-expression-vs-arrow-functions>" %}
