ES6スプレッド演算子の使用例

ES6スプレッド演算子の使用例

スプレッド演算子とレスト演算子とは何ですか?

ES6 では、スプレッド演算子とレスト演算子は両方とも (...) で表されます。スプレッドは展開演算子であり、レストは残りの (コレクション) 演算子です。この演算子をさまざまな場所で使用すると、読み取りと書き込みの観点から考慮できるさまざまな効果が得られます。書き込み操作には収集機能があり、読み取り操作には拡張機能があります。 ES6 では、(...) 演算子は配列に対してのみ機能しましたが、ES7 ではオブジェクトに対する拡張機能が追加されました。

配列スプレッド演算子

残り演算子(コレクション関数)

(...) 演算子を使用しない場合は、合計関数が実装されます。渡されるパラメータは不確定であり、引数のみを使用できます。例えば:

関数sum(){
	sumNumber=0 とします。
    for(let i=0;i<arguments.length;i++){
        合計数 += 引数[i];
    }
    sumNumber を返します。
}
コンソール.log(合計(1,2,3)); //6
コンソール.log(合計(4,5,6,7,8)); //30

REST 演算子を使用すると、コードははるかにシンプルになります。

関数 sum(...arg){
	sumNumber=0 とします。
   	arg.forEach(関数(ele){
        合計数+=要素;
    })
    sumNumber を返します。
}
コンソール.log(合計(1,2,3)); //6
コンソール.log(合計(4,5,6,7,8)); //30

このとき、渡されたパラメータは arg に書き込まれ、配列を形成します。 arg を印刷できます:

関数 sum(...arg){
    console.log(引数);
}
console.log(sum(1,2,3)); // (3) [1, 2, 3]
console.log(sum(4,5,6,7,8)); //(5) [4, 5, 6, 7, 8]

渡すパラメータに渡す必要がある項目がある場合は、パラメータの最後の位置で rest 演算子を使用できます。

関数テスト(a, b, ...arg) {
	console.log(a,b,arg);
}
テスト(1,2,3,4,5,6,7,8); //1 2 (6) [3, 4, 5, 6, 7, 8]

出力された a と b が実際のパラメータの最初の 2 つの項目であり、後で渡されるパラメータが配列に変換されて arg に格納されていることがわかります。

スプレッド演算子

arr = [1,2,3,4,5]とします。
console.log(arr); //(5) [1, 2, 3, 4, 5]
コンソール.log(...arr); // 1 2 3 4 5

ご覧のとおり、(...) 演算子を使用すると、配列が拡張されて出力されます。

配列を結合する場合、従来のアプローチは次のようになります。

arr1=[1,2,3]とします。
arr2=[5,6,7,8]とします。
let arr3=[].arr3.concat(arr1,arr2); //let arr3=new Array();arr3.concat(arr1,arr2); と同等
console.log(arr3); //(7) [1, 2, 3, 5, 6, 7, 8]

(...) 演算子の使用方法:

arr1=[1,2,3]とします。
arr2=[5,6,7,8]とします。
arr3=[...arr1,...arr2]とします。
console.log(arr3); //(7) [1, 2, 3, 5, 6, 7, 8]

どのように実装されているか見てみましょう。babel を使用して ES6 構文を ES5 に変換できます。

「厳密な使用」;

var arr1 = [1, 2, 3];
var arr2 = [5, 6, 7, 8];
var arr3 = [].concat(arr1, arr2);

その実装原理も配列のconcatメソッドであることがわかります。したがって、(...) 演算子は構文上の糖衣であり、元の機能には影響しません。

オブジェクトスプレッド演算子

浅いクローン

ES7 では、(...) 演算子はオブジェクトの拡張をサポートします。

学校にしましょう={	
    名前:'xxx大学',
    履歴:'50'
};
先生に={
    リーダー:{
        名前:'校長xx',
        年齢:'40',
    },
    人数:60
};

上記のオブジェクトを別のオブジェクトに複製する場合、従来のアプローチでは、クローン関数を自分で記述するか、jQuery の extend メソッドを使用します。ここで、(...) 演算子を使用して完了する必要があります。

obj = {
    ...学校、
    ...教師
}
console.log(obj); /* オブジェクト
					履歴: "50"
					リーダー: {名前: "校長 xx", 年齢: "40"}
					名前:「xxx大学」
					人数: 60
					__proto__: オブジェクト*/

ご覧のとおり、クローン作成は (...) 演算子を使用して簡単に実行できますが、このクローン作成は浅いクローン作成です。例えば:

obj.leader.name="xxx";
console.log(obj); /*履歴: "50"
					リーダー: {名前: "xxx", 年齢: "40"}
					名前:「xxx大学」
					人数: 60
					__proto__: オブジェクト */
console.log(教師); /*リーダー: {名前: "xxx", 年齢: "40"}
						人数: 60
						__proto__: オブジェクト */

ES6 には浅いクローンメソッドもあります: Object.assign({ },obj1,obj2,...)

後者のオブジェクトを最初のオブジェクトに複製します。

学校にしましょう={	
    名前:'xxx大学',
    履歴:'50'
};
先生に={
    リーダー:{
        名前:'校長xx',
        年齢:'40',
    },
    人数:60
};
obj={} とします。
オブジェクトに代入します。
console.log(obj); /*履歴: "50"
					リーダー: {名前: "校長 xx", 年齢: "40"}
					名前:「xxx大学」
					人数: 60
					__proto__: オブジェクト*/

クローンも完了していることがわかります。

ディープクローン

obj 内のリーダーの名前の値を変更すると、元の teacher オブジェクト内の対応する値も変更されます。ディープクローニングを実現したい場合は、上記のコードを次のように変更します。

学校にしましょう={	
    名前:'xxx大学',
    履歴:'50'
};
リーダー={
     名前:'校長xx',
       年齢:'40',
}
先生に={
    リーダー:{
        ...リーダー
    }
    人数:60
};
obj = {
    ...学校、
    ...教師、
    リーダー:{
        ...リーダー
    }
}

console.log(obj); /*履歴: "50"
					リーダー: {名前: "校長 xx", 年齢: "40"}
					名前:「xxx大学」
            		人数: 60
					__proto__: オブジェクト*/

obj.leader.name="xxx";

cosnole.log(obj); /*履歴: "50"
					リーダー: {名前: "xxx", 年齢: "40"}
					名前:「xxx大学」
					人数: 60
					__proto__: オブジェクト*/
console.log(リーダー);. /* 年齢: "40"
						名前: 「校長xx」
						__proto__: オブジェクト*/
console.log(teacher); /*リーダー: {name: "校長xx", age: "40"}
						人数: 60
						__proto__: オブジェクト*/

ご覧のとおり、obj 内のリーダーの名前の値を変更しましたが、obj オブジェクトのみが変更され、teacher オブジェクトと leader オブジェクトは変更されていません。
参照値の層が多い場合、この方法はお勧めできません。ディープクローニングメソッドを自分で記述することもできます。もちろん、もっと型破りな方法もあります。 JSON を使用すると、複製するオブジェクトを最初に文字列に変換し、次にそれをオブジェクトに変換することで、新しいオブジェクトが元のオブジェクトと関係がないようにすることができます。

先生に={
    リーダー:{
        名前:'校長xx',
       	年齢:'40',
    }
    人数:60
};
obj = JSON.parse(JSON.stringify(教師)) とします。
console.log(obj); /*リーダー: {名前: "プリンシパルxx", 年齢: "40"}
					人数: 60
					__proto__: オブジェクト*/

obj.leader.name="xxx";

console.log(obj.leader.name); //"xxx"
console.log(teacher.leader.name); //"校長 xx"

ただし、このメソッドで関数 (function())、正規表現 (reg)、特殊オブジェクト (new Data()) を含むオブジェクトを複製すると、上記のプロパティは失われます。上記のプロパティがない場合は、この方法を使用できます。

要約する

ES6 スプレッド演算子に関するこの記事はこれで終わりです。ES6 スプレッド演算子の詳細については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • JavaScript スプレッド演算子の使用例のまとめ [ES6 ベース]
  • ES6拡張演算子の理解と使用シナリオ
  • TSオブジェクトのスプレッド演算子とレスト演算子の詳細な説明
  • ES6拡張演算子の使い方と注意点を詳しく解説
  • ES6 拡張演算子と残り演算子の使用例の分析
  • ES6 配列拡張演算子操作例の分析
  • JS ES の新機能: 拡張演算子の紹介

<<:  独立した IP を介して Windows コンテナ イントラネットの Docker に直接アクセスする方法

>>:  Navicat For MySQL の使い方に関する簡単なチュートリアル

推薦する

Linx awk入門チュートリアルの詳細な説明

Awk はテキスト ファイルを処理するためのアプリケーションであり、ほぼすべての Linux システ...

MySQL 匿名ログインでデータベースを作成できない問題の解決方法

よくある質問ユーザー ''@'localhost' によるデータベー...

MySQL で 1 つのテーブルのフィールドを使用して別のテーブルのフィールドを更新する方法

1. 1列を変更する 学生の更新、都市c s.city_name = c.name を設定します こ...

設定操作からMySQLへのNULLが見つからない問題を解決する

興味深い発見:合計 1000 件のレコードを含むテーブルがあります。クエリ ステートメントは次のよう...

HTML ページ ソース コード レイアウトの概要_Powernode Java Academy

HTML ページ ソース コード レイアウトの概要この紹介では、Google のホームページのソー...

WindowsはVMwareを使用してLinux仮想マシンを作成し、CentOS7.2オペレーティングシステムをインストールします。

目次1. ウィザードに従って仮想マシンを作成します2. オペレーティングシステムをインストールします...

JS の難しさ 同期と非同期、スコープとクロージャ、プロトタイプとプロトタイプ チェーンの詳細な説明

目次JS スリーマウンテンズ同期 非同期同期と非同期の違い範囲、終了関数スコープチェーンブロックスコ...

nginx.conf のルートディレクトリ設定の詳細な説明

nginx.conf を構成するときには常に何らかの問題が発生します。ここでは、よくある問題とその解...

Webpack コンポーネントの使用状況統計を実装するための 50 行のコード

背景最近、リーダーからコンポーネント ライブラリを構築するように依頼があり、プロジェクトで現在使用さ...

Linuxサーバーのディスク容量を拡張する方法

目次序文ステップ序文今日、es ログが記録されていないことに気付きました。filebeat、elas...

MySQL InnoDB トランザクション ロック ソースコード分析

目次1. ロックとラッチ2. 繰り返し読み取り3. インサートロックプロセス3.1 ロックモード3....

JavaScript フォーム検証の例

HTML フォームは、名前、電子メール アドレス、場所、年齢などのユーザー情報を収集するためによく使...

Tomcatのデフォルトプログラム公開パスの使用と変更についての説明

tomcat7 のデフォルトのプログラム公開パスは tomcat/webapps/ROOT/ です。...

XHTML CSS ページをプリンタ ページに変換する

以前は、Web ページのプリンタ対応バージョンを作成するには、印刷したときに見栄えがよくなるようにレ...