# 闇の言語 JavaScript入門 ## まず見るべき参考文献 * uhyoさんの記事 [これ](https://uhyohyo.net/javascript/) * 中級編と書かれているが, 一応基礎からの説明アリ. * 基礎編, 1章, 9章, 11章, 16章でどんな言語かわかる * 残りの章はJavaScriptでいじれるWebAPIのお話とかになる. * 53代oguniの記事[これ](https://misw.github.io/py_js/index.html) * N予備校のプログラミング2019入門記事[これ](https://www.nnn.ed.nico/courses/497/chapters) * このご時世で無料公開されている ## JavaScriptの動作環境 * **ブラウザ上**!! (おすすめはChrome or FireFox) * html経由でjavascriptを読み込むと動く! * 検証ツールのコンソールでも動かせる * mac: cmd + shift + C * windows: F12 or ctrl + shift + i * **NodeJS** [公式ページへ]( https://nodejs.org/ja/) * JavaScriptを動かせる環境 * サーバーを立てられる * npmというパッケージマネジャーが付いてくる. * コマンドラインで操作 * さまざまな簡単にJSを動かせるWebページ * https://codepen.io/ * HTML, CSS, JS * https://glitch.com/ * nodejsも動かせる * ほかにもいろいろいろアルっぽい ## どういう用途に使えるか(ライブラリ, フレームワーク) * ウェブページに機能を追加, サーバーとの通信などのフロントエンドのロジックの実装 * ブラウザに備え付けのWebAPIを操作 * https://developer.mozilla.org/ja/docs/Web/API * 音を出すAPI, 動画を流すAPI, 通信するAPI, 全画面にするAPIなどなど. * 単純にHTMLやCSSを操作 * jQuery * 強力なUIフレームワーク * React * Vue * 2Dのアニメーションなどの描画 * canvas * canvas, WebGLを操作するライブラリたち * p5.js * PIXI.js * CreateJS * 3D描画やVR/ARなど * three.js * A-frame * サーバー(NodeJS) * Express (ウェブフレームワーク) * Koa.js https://koajs.com/ ## 基礎文法 ブラウザがあれば, CodePen https://codepen.io/pen のJS欄にソースコードを書いて, 左下のconsoleで実行結果を確認することができる. nodejsでもいいし, ブラウザの検証ツールのコマンドラインでもいい. ## 基本 基本的にプログラムは上から順に文ごとに実行される. 文の終わりは改行やセミコロンが入る. 改行さえすればセミコロンはつけてもつけなくてもいい. ### 変数 なにか(なんでも)入れられる箱 ```javascript const year = 2020; // 数字 const message = "Hello, world!"; // 文字を入れるときは""で囲む const v = 4 / 3 * 3.14 * 3 * 3 * 3; // 半径3の球の体積 // 四則演算(普通に計算したら実数の計算になる) // 和 => + // 差 => - // 積 => * // 商 => / // あまり => % ``` ;はつけてもつけなくても動きはする. `const`で宣言すると, 後から中身そのものを変えられない (再代入不可). (※ただし, その子プロパティは変更できる(後述)) ```javascript const a = 1; a = 2; // Error 変えられない a = "hoge"; // Error 変えられない ``` 後から中身を変更できる変数を作りたい場合は`let`を使って宣言する. ```javascript let a = 1; a = 2; // 変更された console.log(a); // 文字列も入れられる a = "勝ち取りたいものもない無力なバカにはなれない"; console.log(a); ``` ### 変数の中身を確認 基本的に`console.log(変数)`を使えば, 表示される ```javascript const year = 2020; console.log(year); ``` ### if文 C言語とかと同じ ```javascript let b = 1; if (b === 1) { // == でも行けるが, 文字列"1"でも条件に当てはまってしまう. console.log("ok"); } b = 2; if (b === 1) { // == でも行けるが, 文字列"1"でも条件に当てはまってしまう. console.log("ok"); } // === 等しい, !== 等しくない // >= 以上, > 大きい // <= 以下, < 小さい ``` ## for文 ```javascript for (let i = 0; i < 3; i++) { console.log(i); } ``` switch, while, とかももちろんあるよ. ## 配列(Array) ```javascript const arr = [1, 2, 3, 4, 5]; for (let i = 0; i < 5; i++) { console.log(arr[i]); } const arr2 = [1, "javascript", [2, 3, "aa"], 2]; ``` ## オブジェクト すべてのものはオブジェクト(プリミティブ値以外) オブジェクトの中になんでも名前を付けたものを要られる. key value store ```javascript const obj = {}; // 空のオブジェクト obj.a = [1, 2, 3, 4, 5]; // objにプロパティaを追加 obj.b = "hello"; // プロパティbを追加 obj.c = {a: "a", b: ["b", "b"]}; // プロパティcを追加 console.log(obj); // 子供に名前のついた階層構造を持つようになる. // { // "a": [1,2,3,4,5], // "b": "hello", // "c": { // "a": "a", // "b": ["b", "b"] // } // } const o = {hoge: "hoge", fuga: []}; ``` ## 関数 引数を与えられて, 何かを返すもの. 2つの記述法がある. (地味にこの2つは細かい挙動(thisなど)がことなる) 迷ったときは新しい方の記法であるアロー関数型が使いやすいはず ```javascript // functionキーワードを使った記法 // 2つの引数をとってその和を返す関数を作る function sum(a, b) { return a + b; } sum(1, 2); // アロー関数 // 掛け算した結果をそのまま返す const mul = (a, b) => a * b; // {}で囲んで処理内容を詳しく書ける const printMul = (a, b) => { const result = a * b; console.log(result); return a * b; }; ``` ## クラス 変数や関数を一つのオブジェクトとしてまとめたもの. ライブラリはクラスとして機能を提供していることが多い ### クラスの宣言 `class <クラス名> {<変数(プロパティ)や関数(メソッド)の宣言>}` でクラスの宣言ができる クラスはあくまで設計図で, 後のインスタンス化をすることによって, 具体的なオブジェクトが構成される. インスタンス化する際に呼ばれるのが, constructorメソッドである. ~~クラスのフィールドやメソッドはそれぞれ, 外側から参照できるか(public), できないか(private)を指定できる( **カプセル化**)~~(TypeScriptじゃないとできないんですね... これ)(補足: 最近のバージョンのJavaScriptなら, privateプロパティ/メソッドを名前の先頭に#を付けることで表現できる.) プロパティやメソッドをクラス内から扱いたいとき, 例えば`this.x`などとして`this`から参照できる. ```javascript // クラス Enemyの宣言 (ランダムに移動する敵を作りたい) class Enemy { // クラスが生成されるときに呼び出される処理 constructor(x, y) { this.x = x; this.y = y; } // 毎フレーム呼び出すupdateメソッド update(deltaMs) { const next = this.calcNextPosition(deltaMs); this.x = next.x; this.y = next.y; } // 次の位置を計算するためのメソッド calcNextPosition(deltaMs) { return { x: this.x + Math.random() * deltaMs, y: this.y + Math.random() * deltaMs }; } } ``` ## クラスの利用 プロパティに, あるクラスのフィールドやメソッドを備えるオブジェクトを**インスタンス**といい, インスタンスを設計図となるクラスから生成することを**インスタンス化**という インスタンス化は**new**演算子を使うことで行える. ```javascript // new演算子で設計図となるクラスEnemyから具体的なものを生成. // new <クラス名>(<constructor>への引数) でインスタンス化 const enemy1 = new Enemy(100, 200); const enemy2 = new Enemy(200, 100); let prev = Date.now(); while (true) { const now = Date.now(); const deltaMs = now - prev; prev = now; enemy1.update(deltaMs); enemy2.update(deltaMs); console.log(enemy1.x, enemy1.y); console.log(enemy2.x, enemy2.y); } ``` ## さらなる文法のキーワード import/export extends, 継承 TypeScript