---
# System prepended metadata

title: Node.js で使用される JavaScript の基礎　2021-05-13
tags: [Node.js, JavaScript]

---

---
lang: ja-jp
breaks: true
---
# Node.js で使用される JavaScript の基礎　2021-05-13

## `'use strict'`

> “use strict”（厳格モード）を使うべきか？
> https://analogic.jp/use-strict/


* 「strictモード（厳格モード）」で実行されるようになります。
* コード内に存在する潜在的な問題を早期に発見しやすくなります。また、JavaScriptエンジンによる最適化処理を困難にする誤りを修正するため、strictモードのコードは非strictモードの同一コードよりも高速に実行することができる場合があるなどのメリットがあります。
* strictモードが使用できるのはECMAScript(ES)バージョン5から

## `import`(ブラウザ用)

* importを使うのがESM方式、requireを使うのがCJS方式
* import（ESM）は、ES6で決められたモジュール読み込みの仕様。
* Chromeなどでは動くがIEなどES6に対応していないブラウザでは動かない。
* 関数やクラスの先頭に`export`を付けることで`import`可能なモジュールとして定義。読み込み側では、import文を使って先ほどのモジュールを読み込む。

## `require`（Node.js用）

* `require` は、モジュールをインポートする関数です。
* `require`文は、CommonJSの仕様で、Nodejsの環境で動作してくれる書き方。
* ブラウザ側では`require`文は動作しません。
* `module.exports`オブジェクトに、関数やクラスなどをセットして定義。読み込み側では`require`文を使って先ほどのモジュールを読み込む。
* `require`は、拡張機能を使用することができるnpmモジュール。
* Node.jsは、ESM（ES Modules）を非同期的にロードする方式を採用している。

* 自ファイルと同じ階層にある test.js を読み込む
```javascript=
const test = require('./test');
```
* node_module ディレクトリ、もしくはビルトインモジュールの test2 を読み込む
```javascript=
const test2 = require('test2');
```

## `const { Router } = require('express')` これはどういう意味？？

> https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment

* オブジェクトの分割代入？？

expressモジュール内の`Router`関数を使用する為の宣言であり、以下と同意。
```typescript=
const Router = require('express').Router;
```

ただし、以下のような誤った関数名を指定してもエラーにはならずに、`Router1 == undefined`となる。
```typescript=
const { Router1 } = require('express');
```

## `any`とはどういうこと？？何者？？

あらゆるJavaScriptの値を表す型。

## `(function () { ～ })()`はどういう意味？？
```javascript=
const ca = (function () {
      const results = [];
      for (let i = 0; i < 10; i++) {
        results.push(i);
      }
      return results;
    })();
```
functionの処理自体（括弧でくくられている）を実行（最後の括弧で実行）して、その結果（`return results;`）がcaに格納される事はわかるが、なぜこのようなわかり難い書き方になるのか？？？

以下の書き方でも同じこと。

```javascript=
function anonymous_method() {
    var results = [];
    for (var i = 0; i < 10; i++) {
        results.push(i);
    }
    return results;
}
const ca = anonymous_method();
```

匿名メソッドとして実行することで、実行可能なメソッドを無駄に増やさない工夫か？？
このような書き方は他の言語でも同様だが、いわる今の `はやり` の書き方のように思える。

## == と === の違い。※（!==）もある。

== ：等価演算子
===：厳密等価演算子

:::info
===について
プリミティブ型は、値が同じであればtrueとなるが、オブジェクト型の場合はインスタンスまで同じ場合にのみtrueとなるようだ。
:::

```javascript=
'use strict';

console.log("1" == 1);  // true
console.log("1" === 1); // false

console.log("1" == new Number(1));  // true
console.log("1" === new Number(1)); // false
console.log(new Number(1) === new Number(1)); // false
console.log(new Number() === new Number()); // false

console.log(true == 1);  // true
console.log(true == "1");  // true
console.log(true === 1); //false

console.log(false == 0);  // true
console.log(false == "0");  // true
console.log(false === 0); //false

console.log("str" == new String("str")); // true
console.log("str" === new String("str")); // false

console.log("str" == "str"); // true
console.log("str" === "str"); // true
console.log(new String("str") === new String("str")); // false
console.log(new String() === new String()); // false

console.log("" == ""); // true
console.log("" === ""); // true

console.log(null == null);  // true
console.log(null === null);  // true

console.log(undefined == undefined);  // true
console.log(undefined === undefined);  // true

console.log("" == null); // false
console.log("" == undefined); // false

console.log("" === null); // false
console.log("" === undefined); // false

console.log(null == undefined); // true
console.log(null === undefined); // false

console.log(NaN == 0); // false
console.log(NaN == 0); // false

console.log(NaN == null); // false
console.log(NaN == undefined); // false

console.log(Infinity == null); // false
console.log(Infinity == undefined); // false

console.log(NaN == Infinity); // false
console.log(NaN === Infinity); // false

```

## var const let

|                | const    | let      | var       |
| -------------- | -------- | -------- | --------- |
| 再宣言         | ×        | ×        | ○         |
| 再代入         | ×        | ○        | ○         |
| スコープ       | ブロック | ブロック | 関数      |
| ホイスティング | エラー   | エラー   | undefined |

:::info
変数宣言が常に関数の先頭で行われたことにされる挙動をホイスティング(変数の巻き上げ)といいいます。
:::

:::info
基本的に、varは使用禁止にしてよさそう。
:::

## /** @type {～} */

JSDocは、JavaScriptのソースコードにアノテーション（注釈）を追加するために使われるマークアップ言語です。
@typeの後の{}内に変数の型（String, Number, Boolean）を書き、そのあとに変数の説明を書きます。

## `const imageRouter = module.exports = Router();`はどういう意味？？

`module.exports`として、外部に公開すると同時に、同モジュール内でも使用する為に、`const imageRouter = module.exports`として代入しているという事？？

###### tags: `JavaScript` `Node.js`
