(Javascript) 組み込みオブジェクトとnew演算子によるインスタンス化

#はじめに
今回は、Javascriptの"超基本"
オブジェクト指向をテーマに <strong>組み込みオブジェクトとnew演算子によるインスタンス化</strong> について記録します。

過去に2点ブジェクトについて、記事を投稿しました。

・<a href="https://qiita.com/Tateishi0819/items/10168748360409f38d82" terget="blank">(Javascript) オブジェクト指向 と オブジェクト&配列 の違い</a>
・<a href="https://qiita.com/Tateishi0819/items/bf2f340941b7a10a0bfa" terget="blank">(Javascript) インスタンス化 と コンストラクター</a>
・<a href="https://qiita.com/Tateishi0819/items/00b5adde47a40e3bd1a7" target="blank">(Javascript) 静的プロパティと静的メソッド</a>

#組み込みオブジェクト とは
javascriptが公開しているオブジェクトのことです。
その中でも基本が <strong>組み込みオブジェクト (Built-in Object)</strong> になります。
また 組み込み の意味は <strong>javascriptで標準に組み込まれた</strong> というモノです。

##特徴
・<strong>ブラウザーオブジェクト</strong> が 特定の環境でしか動かないことに対して <strong>組み込みオブジェクト</strong>はjavascriptが動作する全ての環境で利用できることが、特徴です。
・組み込みオブジェクトは、自分でオブジェクトを定義できますが、特に <strong>宣言・定義 をする必要はありません</strong>

##主な組み込みオブジェクト

|オブジェクト  |概要  |バージョン  |
|---|---|---|
|(Global)  |jsの基本機能にアクセスする手段を提供  |  |
|Object  |全てのオブジェクトの雛形となる機能を提供  | |
|Array  |配列を操作するための手段を提供  |  |
|String  |文字列を操作するための手段を提供  |  |
|Boolean  |真偽知を操作するための手段を提供  |  |
|Number  |数値を操作するための手段を提供  |  |
|Function  |関数を操作するための手段を提供  |  |
|Math  |数値演算を行うための手段を提供  |  |
|Date  |日付を操作するための手段を提供  |  |
|RegExp  |正規表現に関わる機能を提供  |  |
|Error / XxxxxError  |エラー情報を管理  |  |
|Map/WeakMap  |キー/連想配列を操作するための手段を提供  |ES2015  |
|Set/WeakSet  |値の集合を管理する手段を提供  |ES2015  |
|Symbol  |シンボルを操作するための手段を提供  |ES2015  |
|Proxy  |オブジェクトの挙動をカスタマイズする手段を提供  |ES2015  |
|Promise  |非同期処理をするための手段を提供  |ES2015  |

<strong>Number・String・Boolean・Symbol</strong> は、Javascrptの主な<strong>データ型</strong>に対応しています。

###サンプルコード 
以下では、<strong>Stringオブジェクト</strong>の<strong>lengthプロパティ</strong>と、オブジェクトを使用していないものの出力結果を比較しています。

```javascript
// 文字をコンソールに出力
let greeting = 'Hello World';
console.log(greeting);
//出力結果→ Hello World

// Stringオブジェクトのlengthプロパティを使用
let text = 'Hello World';
console.log(text.length);
//出力結果→ 11
```

#オブジェクトのインスタンス化の注意
先のコマンドを実行して疑問に思うことはありませんか？
そうです。<strong>Stringオブジェクト</strong>を使用しているのにインスタンス化をしていません。

しかし、javascriptでは リテラル(プログラムに直接記述するデータ値{データ型}) に対応する組み込みオブジェクトは<strong>インスタンス化をする必要がありません。</strong>

##データ型ではインスタンス化は不要
リテラルに対応する組み込みオブジェクトはインスタンス化が不要と先に述べました。

しかし、データ型でもインスタンス化をしてオブジェクトを生成することは可能です。
ですが、↓のソースコードの様に

・記述が長くなる
・出力がおかしくなる

という問題が発生します。

####new演算子によるオブジェクトの出力

```javascript
let item = new Boolean(false); 

if(item) {
    console.log('itemはtrueです');
}
//出力結果→ itemはtrueです
```
※ falseを <strong>Boolean</strong> で設定しているのに、consoleが実行されてしまってます。

####インスタンス化していないオブジェクトの出力

```javascript
let item = false;

if(item) {
    console.log('itemはtrueです');
}
//出力結果→ not available
```
インスタンス化していない、出力が正しい挙動をしています。

その理由は、リテラル(データ型)にインスタンス化を行うと

<strong>null以外のオブジェクトはtrue</strong> とみなしてしまうからです。
もう一度!
<strong>null以外のオブジェクトはtrue</strong> とみなしてしまうからです。

なので、この記述は避けるべきです。
以上から、基本データ型をインスタンス化するのは避けてください。

#あとがき
以上が、<strong>組み込みオブジェクトとnew演算子によるインスタンス化</strong> でした。
いかがでしたか？
役に立っていれば嬉しいです。
では!

#Myリンク
また、Twitter・Portfolio のリンクがありますので、気になった方は
ぜひ繋がってください。プログラミング学習を共有できるフレンドが出来るととても嬉しいです。

<a href="https://twitter.com/0819_tateishi" target="blank">Twitter</a>
<a href="https://ayu-portfolio.herokuapp.com/" target="blank">Portfolio</a>
<a href="https://github.com/ayu0819" target="blank">Github</a>
<a href="https://note.com/ayu0819" target="blank">Note</a>