# JS Primer
>* この記事はJS Primerを参照しています
変数定義あたりは割愛
---
# ✊プリミティブ型でないものは、オブジェクト
### プリミティブ型ってなんだ?
データ型と呼ばれ、基本の7つ
- **文字列**(String)`"こんにちは"` `"よっ!日本一!"`←みたいなテキストのこと
- **数値**(Number) `12345` `6.789`みたいな数字のやつ
- **真偽値**(Boolean) `true` `false` 真か偽か
- **巨大な整数**(BigInt) `9007199254740992n`のように桁が大きい整数
- **undefined** 値が未定義であることを意味する
- **null** 値が存在しないことを意味する
- **シンボル**(Symbol) ES2015から追加された一意で不変な値
### オブジェクト型ってなんだ?
- プリミティブ型以外のデータ
- オブジェクト、配列、関数、正規表現、Dateなど
`typeof`は、プリミティブかオブジェクトかを判断する。オブジェクトの種類までは判定できない。
```javascript=
console.log(typeof null); // => "object"
```
`null`も`object`になるのは仕様でありバグ
ローランドの言葉の様に「俺か、俺以外か」って感じで思えば良いんじゃないか?
つまりローランドはプリミティブ型ってことです(←は?!)
---
## リテラル
プログラム上で数値や文字列など、データ型の値を直接入力できるように構文として定義されたもの。
例えば
`"`と`"`で囲めば**文字列**リテラルになる
(JSは動的型付け言語だから""で囲めば文字列型と認識してくれる。という認識)
### 整数リテラル
2,8,10,16進数のこと
2進数(binary) → 0b
8進数(octal) → 0o
16進数(hex) → 0x
自分は`box`って憶えてる
### テンプレートリテラル
`` ← バッククォートで囲んだ範囲を文字列とするリテラル
\nを使わずにそのまま書く事ができる。
↓こんな感じで
```
`複数行の 複数行の
文字列を → 文字列を
入れたい` 入れたい
```
### nullリテラル
- nullを返すリテラル = 値がない こと
### undefinedはリテラルではない
グローバル変数である。
## オブジェクトリテラル
ハッシュ化する。`{}`の中にkeyとvalueを渡すこと
**`{}`が出てきたら新しいオブジェクトを作成している**
```javascript=
const obj = {
"key": "value"
};
// ドット記法
console.log(obj.key); // => "value"
// ブラケット記法
console.log(obj["key"]); // => "value"
```
ただしkeyを数値にした時は`.`で区切ることが出来ない
```javascript=
// プロパティ名は文字列の"123"
var object = {
"123": "value"
};
// OK: ブラケット記法では、文字列として書くことができる
console.log(object["123"]); // => "value"
// NG: ドット記法では、数値からはじまる識別子は利用できない
object.123
```
## 配列リテラル
`[]`で囲い、`,`で区切ったもの
```javascript=
const emptyArray = []; // 空の配列を作成
const array = [1, 2, 3]; // 値を持った配列を作成
```
## 正規表現リテラル
`/`で囲い、`\`や`+`など特殊記号を使う
直感的に書きにくい。知らないと書けない。
##
## 暗黙の変換
文字列と数字を`+`で繋げると文字列として出力される。これはTSの持つ**型推論**が暗黙的に文字列なのかを判断しているため。
例えば、↓のコードの10行目
```typescript=
// src/index.ts
import { createInterface } from 'readline';
const rl = createInterface ({
input: process.stdin,
output: process.stdout
});
rl.question('文字列を入力してください:', (line) => {
const result = line + 1000; // ←この部分
console.log(result);
// console.log(`${line}が入力されました`);
// console.log(line + 1000);
rl.close();
});
```
(※10,11行目をコメントアウトし、12,13行目のコメントアウトを外しても同じ)
上のindex.tsをまずコンパイルする
`$ npx tsc`
そして実行する
`$ node dist/index.js`すると。。
```javascript=
$ node dist/index.js
文字列を入力してください:789 // ←ここで789と入力する
7891000 // ←789と1000が繋がった形で出力される
```
## 明示的な変換
きちんと演算子が使えるようにするために9行目部分の(line)の前に`Number`が追加されている。これによって引数の中はNumber型であると認識されるのできちんと足し算される。
```typescript=
import { createInterface } from 'readline';
const rl = createInterface ({
input: process.stdin,
output: process.stdout
});
rl.question('文字列を入力してください:', (line) => {
const num = Number(line); // ← この部分
console.log(num + 1000);
rl.close();
});
```
```typescript=
$ node dist/index.js
文字列を入力してください:8888 // ← 8888を入力
9888 // ← +1000されるので9888になる
```
ここで注意が必要なのが`NaN`だ。
`NaN`は数値が必要なのに数値じゃなかった場合に出現する。文字列=>数値が出来ないように。`NaN`は**Not a Number**の略。数字じゃない。
---
## その他の演算子
`|` `&` `^`などの二項演算子以外は予約語としてある。
- void
- delete
- in
- typeof
- instance