JavaScript ではおそらく switch 文を使う必要はない

JavaScript ではおそらく switch 文を使う必要はない

スイッチも複雑なコードブロックもありません

Switch は便利です。式を指定すると、それが case 節内の他の一連の式と一致するかどうかを確認できます。 次の例を考えてみましょう。

const name = "ジュリアナ";

スイッチ (名前) {
  ケース「ジュリアナ」:
    console.log("彼女はジュリアナです");
    壊す;
  ケース「トム」:
    console.log("彼女はジュリアナではない");
    壊す;
}

名前が「Juliana」の場合、メッセージを出力し、すぐにブロックから抜け出します。 switch 関数内では、case ブロック内で return を直接使用することで break を省略できます。

一致するものがない場合、デフォルトのオプションを使用できます。

定数名 = "クリス";

スイッチ (名前) {
  ケース「ジュリアナ」:
    console.log("彼女はジュリアナです");
    壊す;
  ケース「トム」:
    console.log("彼女はジュリアナではない");
    壊す;
  デフォルト:
    console.log("申し訳ございませんが、一致するものはありません");
}

Switch は、if を多く使用することを避けるために Redux リデューサーでも頻繁に使用されます (ただし、Redux Toolkit は定型文を少し簡略化します)。 次の例を考えてみましょう。

定数 LOGIN_SUCCESS = "LOGIN_SUCCESS";
LOGIN_FAILED は、次のようになります。

定数authState = {
  トークン: "",
  エラー: ""、
};

関数 authReducer(状態 = authState, アクション) {
  スイッチ(アクションタイプ){
    LOGIN_SUCCESSの場合:
      return { ...状態、トークン: action.payload };
    LOGIN_FAILEDの場合:
      return { ...状態、エラー: action.payload };
    デフォルト:
      状態を返します。
  }
}

これに何か問題があるでしょうか? ほとんどありません。しかし、もっと良い代替案はあるのでしょうか?

Pythonからのインスピレーション

Telmo からのこのツイートが私の注目を集めました。 彼は 2 つのスタイルの「スイッチ」を示しており、そのうちの 1 つは Python のパターンに非常に近いものです。

Python にはスイッチがないので、より良い代替手段が提供されます。 まず、コードを JavaScript から Python に移植してみましょう。

LOGIN_SUCCESS = "ログイン成功"
ログイン失敗 = "ログイン失敗"

auth_state = {"トークン": "", "エラー": ""}


auth_reducer を定義します(状態 = auth_state、アクション = {}):
    マッピング = {
        LOGIN_SUCCESS: {**state, "token": action["payload"]},
        LOGIN_FAILED: {**state, "error": action["payload"]},
    }

    マッピングを返す。get(アクション["type"], state)

Python では、辞書を使用してスイッチをシミュレートできます。 dict.get() は、スイッチのデフォルト ステートメントを表すために使用できます。

存在しないキーにアクセスすると、Python は KeyError エラーをトリガーします。

>>> my_dict = {

"名前": "ジョン",

"都市": "ローマ",

「年齢」: 44

}

>>> my_dict["ここにはない"]

# 出力: KeyError: 'not_here'

.get() メソッドはエラーを発生せず、存在しないキーにデフォルト値を指定できるため、より安全なアプローチです。

>>> my_dict = {

"名前": "ジョン",

"都市": "ローマ",

「年齢」: 44

}

>>> my_dict.get("not_here", "見つかりません")

# 出力: '見つかりません'

したがって、Python のこの行:

マッピングを返す。get(アクション["type"], state)

JavaScript での同等のものは次のとおりです。

関数 authReducer(状態 = authState, アクション) {
  ...
    デフォルト:
      状態を返します。
  ...
}

辞書を使用してスイッチを置き換える

前の例をもう一度考えてみましょう。

定数 LOGIN_SUCCESS = "LOGIN_SUCCESS";
LOGIN_FAILED は、次のようになります。

定数authState = {
  トークン: "",
  エラー: ""、
};

関数 authReducer(状態 = authState, アクション) {
  スイッチ(アクションタイプ){
    LOGIN_SUCCESSの場合:
      return { ...状態、トークン: action.payload };
    LOGIN_FAILEDの場合:
      return { ...状態、エラー: action.payload };
    デフォルト:
      状態を返します。
  }
}

スイッチを使わずにこれを行うことができます:

関数 authReducer(状態 = authState, アクション) {
  定数マッピング = {
    [LOGIN_SUCCESS]: { ...状態、トークン: action.payload },
    [LOGIN_FAILED]: { ...状態、エラー: action.payload }
  };

  マッピング[アクション.type] || 状態を返します。
}

ここでは、ES6 の計算プロパティを使用します。ここでは、マッピングのプロパティは、LOGIN_SUCCESS と LOGIN_FAILED の 2 つの定数に基づいてオンザフライで計算されます。
属性に対応する値は、ES9 (ECMAScript 2018) に由来するオブジェクト分解です。

定数マッピング = {
  [LOGIN_SUCCESS]: { ...状態、トークン: action.payload },
  [LOGIN_FAILED]: { ...状態、エラー: action.payload }
}

このアプローチについてどう思いますか?スイッチにはいくつかの制限があるかもしれませんが、リデューサーにとってはより良いソリューションかもしれません。

しかし、このコードはどのように動作するのでしょうか?

パフォーマンスはどうですか?

スイッチのパフォーマンスは辞書よりも優れています。次の例を使用してこれをテストできます。

console.time("サンプル");
(i = 0; i < 2000000; i++ とします) {
  const nextState = authReducer(authState, {
    タイプ: LOGIN_SUCCESS、
    ペイロード: "some_token"
  });
}
console.timeEnd("サンプル");

10回ほど測ってみると、

for t in {1..10}; do node switch.js >> switch.txt; 完了

for t in {1..10}; do node map.js >> map.txt; 完了

上記は、JavaScript で switch ステートメントを使用する必要がない理由の詳細です。JavaScript の switch ステートメントの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • JavaScript における 3 つの for ループ ステートメントの使用の概要 (for、for...in、for...of)
  • JavaScript ステートメントの一般的な for ループの詳細な説明
  • JavaScript の条件文の最適化手法の概要
  • Pythonでjsステートメントを実行する方法
  • JavaScriptステートメントを理解するのに役立つ記事

<<:  MySQLの指定順序ソートクエリについての簡単な説明

>>:  Mysql5.6.36 スクリプトのコンパイル、インストール、初期化のチュートリアル

推薦する

ウェブデザインのためのロイヤルブルーのカラーマッチング入門

古典的な色の組み合わせは力と権威を伝え、強いロイヤルブルーはあらゆる古典的な色の組み合わせの中心的な...

全画面ページのスクロール効果を実現するJavaScript

JavaScript DOM を読み終えた後、解釈型 JavaScript スクリプト言語に対する...

Ubuntu 18.04 に Nvidia グラフィック カード ドライバーをインストールするチュートリアル (画像とテキスト付き)

0. 事前準備BIOS でセキュア ブートを無効にします。無効にしないと、サードパーティ ソースを...

HTML における src と href の違いについての簡単な説明

簡単に言うと、srcは「このリソースをロードしたい」という意味で、hrefは「このリソースに関連付け...

FTP、FTPS、SFTPの違いについて簡単に説明します

目次FTP、FTPS、SFTP の概要FTP FTPS FTPサーバーFTPソフトウェアのアクティブ...

Nginx ベースのアクセス制御と接続制限の実装

序文Nginxの組み込みモジュールは、同時リクエスト数の制限とリクエストのソースの制限をサポートして...

Navicat 経由で MySQL にリモート接続する方法

Navicat を使用して IP 経由で直接接続すると、次のようなさまざまなエラーが報告されます: ...

MySQLバックアップとリカバリの実践に関する詳細な説明

1. mysqlbackup の紹介mysqlbackup は、MySQL Enterprise B...

ウェブデザインにおけるインタラクション: ページングの問題に関する簡単な説明

機能: 前のページまたは次のページにジャンプします。要素: ページングの基本要素は、前のページ + ...

Xftp のダウンロードとインストールのチュートリアル (グラフィック チュートリアル)

Windows と Linux 間でファイルを転送する場合は、Xftp ツールを使用できます。この...

複数の画像を切り替えるJavaScript

この記事では、複数の画像を切り替えるJavaScriptの具体的なコードを参考までに紹介します。具体...

Vueはechartsに基づいて3次元の縦棒グラフを実装します

3次元縦棒グラフは、正面、右側、上部の3つの部分で構成されています。描画するときは、正面をグラフィッ...

CentOS サーバーの時間を北京時間に変更する方法

1. VPSとCentOSシステムを購入しましたが、サーバーの時間が北京時間と一致せず、時差があるこ...

ファイルのアップロードの進行状況を示す React の例

目次React アップロードファイル表示の進行状況デモフロントエンドにReactアプリケーションを素...