JavaScript 構造化代入の詳細な説明

JavaScript 構造化代入の詳細な説明

コンセプト

ES6 では、配列やオブジェクトから値を抽出するための、より簡潔な割り当てモードが提供されており、これをデストラクチャリングと呼びます。

例:

[a, b] = [50, 100];
コンソールにログ出力します。
// 期待される出力: 50
コンソールログ(b);
// 期待される出力: 100
[a, b, ...残り] = [10, 20, 30, 40, 50];
コンソールにログを出力します。
// 期待される出力: [30, 40, 50]

配列の分割

配列の分割は非常にシンプルで簡潔です。代入式の左側に配列リテラルを使用します。配列リテラル内の各変数名は、分割配列内の同じインデックス項目にマップされます。

これは何を意味するのでしょうか? 次の例のように、左側の配列の項目は、右側の分解された配列の対応するインデックスの値を取得することを意味します。

[a, b, c] = [1, 2, 3]とします。
// a = 1
// b = 2
// c = 3

値を個別に宣言して割り当てる

変数を宣言することで、値を個別に分解して割り当てることができます。

: 変数を宣言し、値を割り当てる

// 変数を宣言する let a, b;
// 次に、それぞれ値 [a, b] = [1, 2] を割り当てます。
コンソールログ(a); // 1
コンソールログ(b); // 2

デフォルト値の構造化解除

分解によって抽出された値が未定義の場合は、デフォルト値を設定できます。

a、bとする。
// デフォルト値を設定 [a = 5, b = 7] = [1];
コンソールログ(a); // 1
コンソールログ(b); // 7

上記の例では、aとbの両方にデフォルト値を設定しています。

この場合、aまたはbの値が未定義の場合、設定のデフォルト値が対応する変数に割り当てられます(aには5が割り当てられ、bには7が割り当てられます)。

変数値の交換

これまでは、2つの変数を次のように交換していました。

//交換ab
c = a;
a = b;
b=c;

またはXOR方式

ただし、分割代入では、1 つの分割式で 2 つの変数値を交換できます。

a = 1 とします。
b = 3 とします。
//aとbの値を交換する [a, b] = [b, a];
コンソールログ(a); // 3
コンソールログ(b); // 1

関数によって返される配列の分解

配列を返す関数を直接分解することができます

関数c() {
  [10, 20]を返す。
}
a、bとする。
[a, b] = c();
コンソールログ(a); // 10
コンソールログ(b); // 20

上記の例では、c() の戻り値 [10, 20] を 1 行のコードで分解できます。

戻り値を無視する(または項目をスキップする)

不要な戻り値を選択的にスキップできます

関数c() {
  [1, 2, 3]を返します。
}
[a, , b] = c() とします。
コンソールログ(a); // 1
コンソールログ(b); // 3

配列の残りを変数に割り当てる

配列の分割を使用すると、割り当てられた配列の残りを変数に割り当てることができます。

[a, ...b] = [1, 2, 3]とします。
コンソールログ(a); // 1
console.log(b); // [2, 3]

この場合、b も配列になり、配列内の項目は残りのすべての項目になります。

知らせ:

ここで注意すべき点は、最後にカンマを入れられないことです。余分なカンマを入れると、エラーが報告されます。

[a, ...b,] = [1, 2, 3]とします。
// 構文エラー: 残りの要素に末尾のカンマがない可能性があります

ネストされた配列の分割

オブジェクトと同様に、配列もネストできます。

例:

定数color = ['#FF00FF', [255, 0, 255], 'rgb(255, 0, 255)'];
// ネストされた分割代入を使用して赤、緑、青を割り当てます
// ネストされた分割代入を使用して赤、緑、青を割り当てます
const [hex, [赤、緑、青]] = 色;
console.log(16進数、赤、緑、青); // #FF00FF 255 0 255

文字列の分割

配列の分解では、分解対象がトラバーサブル オブジェクトである場合、分解割り当てを実行できます。トラバーサブル オブジェクトとは、Iterator インターフェイスを実装するデータです。

[a, b, c, d, e] = 'hello' とします。
/*
a = 'h'
b = 'e'
c = 'l'
d = 'l'
e = 'お'
*/

オブジェクト分解

基本的なオブジェクトの分解

x = { y: 22, z: true } とします。
let { y, z } = x; // 省略形 let {y:y,z:z} = x; console.log(y); // 22
console.log(z); // 真

新しい変数名に値を割り当てる

オブジェクト分割を使用するときに変数の名前を変更できます

o = { p: 22, q: true } とします。
{p: foo, q: bar } = o とします。
コンソールログ(foo); // 22
console.log(bar); // 真

上記のコードに示すように、var {p: foo} = o はオブジェクト o のプロパティ名 p を取得し、それを foo という名前の変数に割り当てます。

デフォルト値の構造化解除

分解されたオブジェクトの値が未定義の場合、デフォルト値を設定できます。

{a = 10, b = 5} = {a: 3}とします。
コンソールログ(a); // 3
コンソールログ(b); // 5

デフォルト値を指定しながら新しいオブジェクト名に値を割り当てる

前述のように、新しいオブジェクト名に値を割り当てます。ここで、新しいオブジェクト名のデフォルト値を指定できます。構造化されていない場合は、デフォルト値が自動的に使用されます。

{a: aa = 10、b: bb = 5} = {a: 3}とします。
コンソールログ(aa); // 3
コンソールログ(bb); // 5

配列とオブジェクトの分割を一緒に使用する

配列とオブジェクトは構造体内で一緒に使用できます

定数プロパティ = [
  { id: 1、名前: 'Fizz' },
  { id: 2、名前: 'バズ' },
  { id: 3、名前: 'FizzBu​​zz' },
];
const [, , { name }] = props;
console.log(name); // "FizzBu​​zz"

不完全な解体

obj = {p: [{y: 'world'}] } とします。
let {p: [{ y }, x ] } = obj; //xを分解しない
// x = 未定義
// y = '世界'

オブジェクトに休止値を割り当てる

{a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40}とします。
// a = 10
// b = 20
// 残り = {c: 30, d: 40}

ネストされたオブジェクトのデストラクチャリング(デストラクチャリングは無視できます)

obj = {p: ['hello', {y: 'world'}] };
{p: [x, {y}] } = objとします。
// x = 'こんにちは'
// y = '世界'
obj = {p: ['hello', {y: 'world'}] };
let {p: [x, { }] } = obj; // yを無視
// x = 'こんにちは'

予防

宣言された変数の構造化解除には注意する

エラーのデモンストレーション:

xとします。
1 は 0 です。

JavaScript エンジンは {x} をコード ブロックとして解釈するため、構文エラーが発生します。JavaScript がコード ブロックとして解釈するのを防ぐために、行の先頭に中括弧を記述しないでください。

正しい書き方:

xとします。
({x} = {x: 1});

正しい書き方は、分解代入ステートメント全体を括弧で囲むことで、正しく実行されます。

関数パラメータの分割代入

関数パラメータは分割代入を使って割り当てることもできる

関数 add([x, y]) {
	x + y を返します。
}
追加([1, 2]);

上記コードでは、add関数の引数は表面上は配列になっていますが、引数を渡す際に配列引数を変数xとyに分解しています。関数にとってはxとyを直接渡しているのと同じことになります。

脱構築の用途

分割代入には多くの用途がある

変数の値の交換

x = 1 とします。
y = 2とします。
y = 0;

上記のコードは、x と y の値を入れ替えます。これは簡潔なだけでなく、読みやすく、意味も明確です。

関数から複数の値を返す

関数は 1 つの値しか返せません。複数の値を返したい場合は、配列またはオブジェクトでのみこれらの値を返すことができます。分割代入を使用すると、バッグから何かを取り出すだけで、オブジェクトまたは配列からこれらの値を取得できます。

// 配列を返す関数 example() {
  [1, 2, 3]を返します。
}
[a, b, c] = example() とします。
// オブジェクトを返す function example() {
  戻る {
    フード: 1,
    バー: 2
  };
}
{ foo, bar } = example() とします。

JSONデータの抽出

構造化代入は、JSON オブジェクトからデータを抽出する場合に特に便利です。

例:

jsonData = {
  id: 42,
  ステータス: 「OK」、
  データ: [867, 5309]
};
{id、ステータス、データ:数値} = jsonData;
console.log(ID、ステータス、番号);
// 42, "OK", [867, 5309]

上記のコードを使用すると、JSONデータ内の値を素早く取得できます。

要約する

この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。

以下もご興味があるかもしれません:
  • ES6 における JavaScript 分割代入の一般的な使用法の概要
  • JavaScript の構造化代入を理解するのに役立つ記事
  • JavaScript 構造化分解割り当ての実践ガイド
  • JS ES の新機能、変数分離割り当て
  • JavaScript の構造化代入の一般的なシナリオと例 5 つ
  • js における浅いコピーと深いコピーの詳細な説明
  • JS ES6 変数分割代入の詳細な説明
  • JavaScript の割り当て、浅いコピーと深いコピーの違い

<<:  純粋な CSS で DIV サスペンションを実装するサンプル コード (固定位置)

>>:  Linux でのインストール中にソフトウェア パッケージの依存関係レポートに関連する問題の解決策

推薦する

React forwardRefの使い方と注意点

これまで react.forwardRef は react の高階コンポーネントには適用できませんで...

クラウドサーバーはBaotaを使用してPython環境を構築し、Djangoプログラムを実行します。

目次PagodaをインストールするPythonランタイム環境を構成するPythonをインストールする...

MySQL テーブルを作成するためによく使用される SQL ステートメントの概要

最近、私はプロジェクトに取り組んでおり、背景を記述するために SQL ステートメントを使用する必要が...

SQL 結合クエリの内部結合、外部結合、クロス結合の違いの詳細な説明

データベースを使用するアプリケーションを開発する場合、必然的にユニオンクエリを使用する必要があります...

CSS を使用して等アスペクト比のアダプティブ コンテナを実装する方法

最近、モバイル ページを開発しているときに、ページの幅が 100% の場合、高さは幅の半分になり、携...

MySQL マスタースレーブレプリケーションプロセスの詳細な説明

1. マスタースレーブレプリケーションとは何ですか?マスター データベースの DDL および DML...

HTMLとは何ですか?

HTML 開発の歴史: HTML は英語で Hypertext Marked Language の...

MySQL で戻り値ありと戻り値なしのストアド プロシージャを書く 2 つの方法

プロセス1: 戻り値あり: proc_addNum が存在する場合はプロシージャを削除します。 プロ...

Centos7.3 での mysql5.7 のインストールと設定のチュートリアル

この記事では、MySQL 5.7のインストールと設定のチュートリアルを参考までに紹介します。具体的な...

フォーム送信ページの更新がジャンプしない

1. ソースコードの設計コードをコピーコードは次のとおりです。 <!DOCTYPE html ...

CentOS7 ファイアウォールとオープンポートの簡単な使い方の簡単な紹介

概要(公式にはより詳しい説明があります) Firewalld は、ネットワーク接続またはインターフェ...

フロントエンドアプリケーションのjenkins+gitlab+nginxデプロイメント

目次関連する依存関係のインストールドッカーDockerでJenkinsをインストールするDocker...

Vue3 setup() の高度な使用例の詳細な説明

目次1. オプションAPIと組み合わせAPIの違い2. セットアップを具体的にどのように使用するので...

LinuxでのDNSサーバーの設定の詳細な説明

1. DNSサーバーの概念インターネットでの通信には IP アドレスの助けが必要ですが、数字に対する...

Docker コンテナで DockerFile を使用して複数の Tomcat サービスをデプロイする手順

1. [admin@JD ~]$ cd opt #ルートディレクトリにoptと入力2. [admin...