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 の使い方に関する簡単なチュートリアル

推薦する

Vueリストデータを削除した後、ページを自動的に更新する方法と更新方法の詳細な説明

問題の説明:フロントエンドがデータの一部を削除したり、新しいデータを追加したりすると、バックエンドの...

JavaScript を使用して簡単なアルゴリズムを実行する方法

目次質問1件2つの方法3 実験結果と考察質問1件ご存知のとおり、 Pycharm 、 IDLE 、 ...

springcloud alibaba nacos linux 設定の詳細なチュートリアル

まず、github から nacos の圧縮パッケージをダウンロードします: https://git...

WeChatアプレットが弾丸画面を送信するビデオプレーヤーを実装

この記事では、WeChatアプレットでビデオプレーヤーの集中砲火を実装するための具体的なコードを参考...

Mac で docker と kubectl の自動補完コマンドを追加する方法

kubectl の紹介kubectl は、k8s クラスターを操作するためのコマンドライン ツールで...

擬似分散グラフィックを実現するための VMware 構成 Hadoop チュートリアル

1. 実験環境シリアルナンバープロジェクトソフトウェアとバージョン1オペレーティング·システムCen...

MYSQL 左結合の最適化 (10 秒から 20 ミリ秒)

目次【機能背景】 [生のSQL] 【独自SQL解析】 【分析手順】 [最適化されたSQL] 【最適化...

Linux での MySQL のインストールに関するチュートリアル

目次1. 古いバージョンを削除する2. サーバーのカーネルタイプを確認し、適切なバージョンをダウンロ...

MacにMySQLデータベースをインストールする方法を教えます

Mac 用 MySQL をダウンロード: https://downloads.mysql.com/a...

Vue の高度な構築プロパティの詳細な説明

目次1. ディレクティブカスタムディレクティブ2. ミックスイン3. 継承を拡張する4. 提供して注...

ウェブページのテーブルの境界線を設定する方法

<br />前回は、Web テーブルにセルの線を設定する方法を学びました。今日は、Web...

Centos7 から Centos8 へのアップグレードに関するチュートリアル (画像とテキスト付き)

正式な環境でアップグレードする場合は、データと重要な設定をバックアップしてください。アップグレードに...

React を使って小さなプログラムを書くための Remax フレームワークのコンパイル プロセス分析 (推奨)

Remax は、実行時に構文制限のないソリューションを採用した React を使用して小規模なプロ...

JS のオブジェクトリテラルの詳細な説明

目次序文1. オブジェクト構築にプロトタイプを設定する1.1 __proto__ の使用における特殊...

シンプルなドラッグ効果を実現するJavaScript

この記事では、簡単なドラッグ効果を実現するためのJavaScriptの具体的なコードを参考までに紹介...