---
# System prepended metadata

title: JS Primer

---

# 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