# 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