---
# System prepended metadata

title: JavaScriptとは

---

# 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)
