# JavaScriptとは - jsはウェブブラウザで動くプログラミング言語 - 型の位置づけとしては動的型付け言語 動的型付け言語って? **動的にデータ型が設定される言語** ```javascript= let sample = 100; //Number型 sample = "文字列" //String型 ``` 特徴: - 型の宣言をしなくてもjsが実行されたタイミングでデータがきまる - 途中で変数のデータ型が変わることが許容されている 静的型付け言語 ```java int num; num = 5; ``` ## JavaScriptとECMAScript - JavaScriptはECMAScriptという仕様によって動作が決められている。 - ブラウザで動くjs、サーバーサイド側で動くnode.js各実行環境毎に仕様が決められている。 - ECMAScriptという仕様(共通の部分)も毎年アップデートされている。 ECMAScript1 1997年6月 ECMAScript2 1998年6月 2015年よりES2015(ES6)西暦が使われるようになった。 ## 大文字と小文字を区別する jsでは大文字小文字を区別する ```javascript= // `name`という名前の変数を宣言 const name = "azu"; // `NAME`という名前の変数を宣言 const NAME = "azu"; ``` ## 予約語をもつ あらかじめjsで決まったキーワードが存在し、それらは変数や関数の名前として定義できない ```javascript= let const = 1 //SyntaxError: Unexpected token 'const' function const(name) { console.log("こんにちは" + name + "さん"); } const("名前"); //SyntaxError: Unexpected token 'const' ``` ECMAScript 2020現在で主な予約語 - await - break - case - catch - class - const etc... ## 文はセミコロンで区切られる 文はセミコロン(;)によって区切られる 意図しない挙動が起こる可能性があるため基本的にはつける ```javascript // 式や文の間にスペースがいくつあっても同じ意味となる 1 + 1; 1 + 1; ``` [面白い記事](https://pisuke-code.com/js-when-do-you-need-semicolon/) セミコロンがある場合とない場合の子挙動について 正しい書き方 ```javascript! let y = 0; let func = function hoge(x) { return x; }; (function fuga(x) { console.log("x : ", x); y = x; return x; })(100); console.log("func : ", func); console.log("y : ", y); //x : 100 //func : func : ƒ hoge(x) { // return x; // } //y : 100 ``` セミコロンがない場合 ```javascript let y = 0 let func = function hoge(x){ return x } (function fuga(x){ console.log('x : ', x) y = x return x })(100) console.log('func : ', func) console.log('y : ', y) ``` 関数のあとにセミコロンなしで () で囲まれた値・関数がある場合、それは直前の関数の引数として解釈される。 以下の用に解釈する ```javascript! let y = 0; let func = (function hoge(x) { return x; })(function fuga(x) { console.log("x : ", x); y = x; return x; })(100); console.log("func : ", func); console.log("y : ", y); //x : 100 //func : 100 //y : 100 ``` ▼ やってることは次と同じになる hoge関数にfuga関数を丸ごと渡す hoge関数内でfuga関数を返す 最後にそれに100を渡して実行 ## strict mode 名前のとおり厳格な実行モードで、古く安全でない構文や機能が一部禁止されている。 使い方 ```javascript! "use strict"; ``` letやconstなどの変数の宣言をしてあげないとエラーになる ```javascript! "use strict"; x = 3; console.log(x); // => ReferenceError //一番上に記載を行うとトップレベルで適応される。 ``` ```javascript { "user strict" //適応される } //ここは適応されない ``` https://www.sejuku.net/blog/58342 </br> **皆さんも何があれば!!!** --- ### 動的型付け言語 JavaScript, Ruby, PHP, Pythonなど **メリット** * 記述量が少ない **デメリット** * プログラムを実行しないとバグが分からない * 無駄なメモリが発生する <br/> ### 静的型付け言語 TypeScript, Java, Go, C言語など **メリット** * コンパイル時にエラーが発生する (コンパイル・・・ソースコードを解析し、コンピュータが直接実行可能な形式のプログラムに変換すること。[参考リンク](https://e-words.jp/w/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB.html)) * メモリの最適化が行える * パフォーマンスの向上が狙える **デメリット** * 記述量が多い > コンパイラも決して全知全能ではありません。ちゃんと型を教えてあげなければ、いいコンパイラに成長しません。逆に型注釈をちゃんとしていけば、多くの問題に気がつく賢いコンパイラに育っていきます。この観点に立つと、型注釈はコストではなく、コンパイラを正しく育て、バグを未然に防ぐための「投資」と考えることができるのではないでしょうか。 <br/> **参考リンク** [動的型付けと静的型付け](https://qiita.com/toryuneko/items/c023031b61886cae2a99) [動的言語と静的言語の違い](https://qiita.com/wann/items/16920b070dc0483f152a) [動的型付けと静的型付けの違い](https://zenn.dev/kousei_089/articles/quiet_dynamic) [サバイバルTypeScript](https://typescriptbook.jp/overview/static-type) --- ### リンター/フォーマッター * ESlint * Prettier 2つ合わせて導入するケースが多い。やや設定が必要。 VSCodeの拡張機能もある。 [eslintとprettierの組み合わせ](https://zenn.dev/kohski/articles/eslint-prettier-integration)