blog

ES6学習ノート III: 拡張関数

3.拡張演算子 一般的な使用{}は、行に書くことができ、returnキーワード式を省略することができます{}を使用することができ、ログprint関数呼び出しで、戻り値はありませんし、未定義を表示します...

Sep 25, 2020 · 4 min. read
シェア

デフォルト値を持つ関数への引数

デフォルト値は数値

		//es5 引数のデフォルト値
 function add(a, b) {
 a = a || 10;
 b = b || 20;
 return a + b;
 }
 console.log(add()); //20
 //es6
 function add1(a = 10, b = 20) {
 return a + b;
 }
 console.log(add1()); //30
 function add2(a = 10, b = 20) {
 return a + b;
 }
 console.log(add2(1)); //21 引数に順番に値を割り当てる

デフォルト値は関数

 		function add3(a, b = getVal(5)) {
 return a + b;
 }
 function getVal(val) {
 return 5 + val;
 }
 console.log(add3()); //a することはできない。=10  =NaN
 console.log(add3(2)); //12 -->2+(5+5)

残りの引数...keys

複数の独立した値を1つの配列に結合

es6 ....keysの代わりにarguments ....keysは残りのすべての引数に、argumentsはすべての引数に対応します。

 function pick(obj) {
 let result = Object.create(null);
 for (let i = 1; i < arguments.length; i++) { //arguments 前のパラメータを除外する必要がある
 result[arguments[i]] = obj[arguments[i]];
 }
 return result;
 }
//...keys残りの引数
 function pick1(obj, ...keys) {
 let result = Object.create(null);
 for (let i = 0; i < keys.length; i++) { // ...keys直接残りの引数をたどることはできない
 result[keys[i]] = obj[keys[i]];
 }
 return result;
 }
 const book = {
 title: "es6",
 author: "hattie",
 year: 2020
 }
 let bookData = pick(book, "author", "year");
 let bookData1 = pick1(book, "author", "year");
 console.log(bookData);
 console.log(bookData1);

...キーは実配列 引数は擬似配列

 		function checkArgs(...args) {
 console.log(args); //(3) ["a", "b", "c"] 実際の配列
 console.log(arguments); //Arguments(3) ["a", "b", "c", callee: (...), Symbol(Symbol.iterator):  ]  
 }
 checkArgs('a', 'b', 'c');
 let fn3 = (...res) => (res);
 console.log(fn3(1, 2, 3)); //[1, 2, 3]

拡張演算子...

配列を分割し、個々の項目を引数として関数に渡します。

 		const arr = [2, 3, 1, 7];
 //es5applyを使ってarr配列の値を分割し、Mathに渡す。.max()
 console.log(Math.max.apply(null, arr)); //7
 //es6 ...拡張演算子は配列内の値を分割する
 console.log(Math.max(...arr)); //7

アロー関数=>

1.function(){}イコール =>

一般的には{}が使用され、returnキーワードを省略し、行で記述できる式は()として使用できます。

		// let fn0 = (id, name) => {
 // return {
 // id,
 // name
 // }
 // }
 let fn0 = (id, name) => ({id,name}); //オブジェクトを返す
 console.log(fn0(1, "hattie"));

2.関数とクロージャの即時実行

		//関数の即時実行
 let fn = (function() {
 console.log("hello");
 })();
 // クロージャ
 let fn1 = (function() {
 return function() {
 console.log("world");
 }
 })();
 console.log(fn1);
 // 即時関数は関数を返す
 // ƒ (){
 // console.log("world");
 // }
 //クロージャ・アロー関数
 let fn2 = (() => {
 // return () => {
 // console.log("hello");
 // }
 return () => (console.log("hello2"))
 })();
 fn2(); //hello2

3.=>{戻り値} {}の中身は、関数本体にreturnキーワードがあるかどうかに関わらず、戻り値です。

通常の関数 function(){} がログ付きで呼び出された場合、戻り値がないと undefined と表示されます。

		let fn4 = function() {
 2 + 3;
 }
 console.log(fn4());//undefined
 let fn5 = () => (3);
 console.log(fn5()); //3

アロー関数はスコープを持たず、thisのポイントを変えません。

1.arrow関数を使用せず、bindを使用して thisを呼び出しオブジェクトにバインドします。

 let pageHandle = {
 id: 123,
 // init: function() {
 // document.addEventListener('click', function(event) {
 // console.log("ここで thisは以下を指す。+ this); //ページをクリックすると、ここにある thisは以下を指している:[object HTMLDocument] pageHandleオブジェクトではない
 // })
 // }
 init: function() {
 document.addEventListener('click', function(event) {
 console.log("ここで thisは以下を指す。+ this); //ページをクリックすると、ここでの thisは以下を指す:[object Object] pageHandle 
 }.bind(this)) //bind関数呼び出し元の thisを指すように thisを変更し、内部の thisが関数呼び出し元を指すようにする。
 }
 };
 pageHandle.init();
  1. 矢印関数は、矢印関数はスコープを持っていません//1。 オブジェクト内のメソッドは、矢印関数で定義されていません//2。矢印関数を持つオブジェクト内のメソッド内の関数は、スコープを生成しない、thisポインティングを変更しません。
 let page = {
 id: 123,
 init: () => {
 document.addEventListener('click', (event) => {
 console.log(this); //Window {}
 this.do(event.type); //this.do is not a function.
 //doメソッドはウィンドウではなくページに属しており、ウィンドウを指す thisで呼び出すとエラーになる。
 }, false)
 },
 do: function(type) {
 console.log(`イベントタイプに置き換えることはできない:${type},現在のID${this.id}`);
 }
 }
 page.init();

アローファンクション・ノート

1.arrow関数の内部には引数がありません。

 let fn8 = (a, b) => {
 console.log(this); //Window {}
 console.log(arguments); //arguments is not defined
 return a + b;
 }
 fn8();

2.コンストラクタをアロー関数で置き換えることはできません。

通常の関数はオブジェクト

しかし、アロー関数は単なる式であり、構文糖であってオブジェクトではありません。

		let Person = function(id, name) { //ここでPersonのP構文は大文字でも小文字でも構わないが、セマンティクス上、大文字にする必要がある。
 this.id = id;
 this.name = name
 };
 let p = new Person(1, "hattie");
 console.log(p);
 let Person1 = () => {
 }
 let p1 = new Person1(); //Person1 is not a constructor
Read next

タイプスクリプトのフラッディング + デコレーター (IV)

ジェネリックス: ソフトウェア・エンジニアリングでは、一貫性のある明確に定義された API を作成するだけでなく、再利用性を考慮することも重要です。 コンポーネントが現在のデータ型だけでなく将来のデータ型もサポートできることは、大規模なシステムを作成する際に大きな柔軟性をもたらします。 C#やJavaのような言語では、再利用可能なコンポーネントを作成するためにジェネリクスを使用することができます。

Sep 25, 2020 · 13 min read