ES 6:関数&概要の深さのコピーについて
6391 ワード
標準の先頭
今日はES 6の関数の一部を見てみましょう
関数#カンスウ#
関数の初期値
場合によっては、関数の必須パラメータではなく、デフォルト値を与えることができます.プログラムが完全にエラーが発生しないことを保証します
初期には、初期値を割り当てると、次のようになります.
しかし、この方法は清潔で美しくありません.メンテナンスが面倒
ES 6では、パラメータバーに直接デフォルト値を指定できます.
これにより、方法がよりきれいに見えます.プログラムの正常な運行を保証した
babelでES 5コードreviewにコンパイルできます.
ES 5コードに変換すると,その変換方法はパラメータリスト内に値があり,長さが十分であるか否かを判断することであることがわかる.そして判断する
関数の残りのオペレータ
多くの繰り返しパラメータの関数では,「...」を用いることができる.残りのオペレータを省略
たとえば、各パラメータを加算する方法があります.パラメータは長さを任意に定義できます.ただし、長さは>2でなければなりません.
ES 5では、多くのパラメータ名を繰り返し書く可能性があります.無駄になるだけでなく、プログラムの読みやすさも悪くなります
実はparam 2-param 5からES 6を利用して同じパラメータにマージすることができます.手動で拡張する必要がない
マージされたパラメータは配列として出力され、配列の操作に従って操作できます.
かんすうパラメータかいそう
オブジェクトをパラメータとして関数に入力し、関数パラメータもオブジェクトとして受け入れます.解体を完了することができます
前にどうすればいいか覚えていますか?双方のタイプを解釈するには、データフォーマットが類似していることを保証します.
理解にかたくない
矢印関数
矢印関数はES 6関数の中で最もNiceの知識であるはずです.中国語の名前は「矢印関数」、英語の名前は「Lambda式」です.
矢印関数は、メソッドを宣言するときに、より簡単で便利にするためです.構文は次のとおりです.
矢印の左にパラメータリスト、右に関数メソッド体
関数にパラメータが1つしかない場合は、関数の方法をより簡略化できます.
しかし、矢印関数を使うときは気をつけてください.矢印関数を使用すると、「役割ドメイン」という問題に関連します.この問題は通常、私たちのキーワードthisの値に影響します.
矢印関数内でthisが呼び出されるため、役割ドメインは矢印関数自体ではなく、矢印関数よりも大きなレベルの関数を指します.くりを一つあげる
このときコンソール出力undefined
私たちが言ったように、矢印関数内のthisは、その前の関数の役割ドメインを指します.しかし、彼は関数体を1層も持っていない.これを印刷してundefinedを表示します
概要の深さと浅さのコピー
まずこのようなコードを書きます
一般的な論理に従って、myInfoをheInfoにコピーします.それからheInfo内の属性を修正して、myInfoを出力しても変わらないはずです.
でも私たちは間違っています
このようなオブジェクトコピーを「浅いコピー」と呼ぶ.メモリアドレスをコピーしただけで、新しい変数にコピーされたメモリはありません.
このような浅いコピーには、ES 6の「Object.assign()」メソッドもあります.彼の役割は、2つのオブジェクトを入力してマージし、3番目のオブジェクトに値を割り当てることです.
浅いコピーを使用することもありますが、一般的には深いコピーを使用します.つまり私たちがよく言う値伝達です
深いコピーの仕方が多い.私の学识が限られているため、みんなに1つの理解しやすい深いコピーの方法を持ってきます
1. JSON.parse()とJSON.stringifyメソッド
これは最も簡単な深いコピー方法だと思います.ソースオブジェクトをJSONオブジェクトに変換し、parseメソッドでオブジェクトに再解放するのが原理です.このように振り回されると、メモリアドレスが変わります.深いコピーの効果が得られます
結果出力:
その原理も簡単で、オブジェクトを遍歴することで、オブジェクトの各値を新しいオブジェクトに個別にコピーし、全体的なコピーを行わない.オブジェクトの最小単位に分割
heInfo=clone(myInfo)を呼び出します.
結果出力は
深いコピーの究極の探求(90%の人は知らない)
The End
Babel中国語ネット-ES 6オンライン変換ES 5ツール
今日はES 6の関数の一部を見てみましょう
関数#カンスウ#
関数の初期値
場合によっては、関数の必須パラメータではなく、デフォルト値を与えることができます.プログラムが完全にエラーが発生しないことを保証します
初期には、初期値を割り当てると、次のようになります.
// ES5
function ajax(url, method, param) {
method = method ? method : 'GET';
param = param ? param : {};
console.log(url, method, param);
}
しかし、この方法は清潔で美しくありません.メンテナンスが面倒
ES 6では、パラメータバーに直接デフォルト値を指定できます.
function ajax(url, method = 'GET', param = {}) {
console.log(url, method, param)
}
これにより、方法がよりきれいに見えます.プログラムの正常な運行を保証した
babelでES 5コードreviewにコンパイルできます.
'use strict';
function ajax(url) {
var method = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'GET';
var param = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
console.log(url, method, param);
}
ajax('http://www.baidu.com');
ES 5コードに変換すると,その変換方法はパラメータリスト内に値があり,長さが十分であるか否かを判断することであることがわかる.そして判断する
関数の残りのオペレータ
多くの繰り返しパラメータの関数では,「...」を用いることができる.残りのオペレータを省略
たとえば、各パラメータを加算する方法があります.パラメータは長さを任意に定義できます.ただし、長さは>2でなければなりません.
ES 5では、多くのパラメータ名を繰り返し書く可能性があります.無駄になるだけでなく、プログラムの読みやすさも悪くなります
function sum(param1, param2, param3, param4, param5) {
console.log(param1 + param2 + param3 + param4 + param5);
}
実はparam 2-param 5からES 6を利用して同じパラメータにマージすることができます.手動で拡張する必要がない
function sum(param1, ...paramN) {
let result = param1;
paramN.forEach((param) => {
result += param
});
console.log(result);
}
マージされたパラメータは配列として出力され、配列の操作に従って操作できます.
かんすうパラメータかいそう
オブジェクトをパラメータとして関数に入力し、関数パラメータもオブジェクトとして受け入れます.解体を完了することができます
前にどうすればいいか覚えていますか?双方のタイプを解釈するには、データフォーマットが類似していることを保証します.
function f({name, age}) {
console.log(name, age);
}
f({name: 'janlay', age: 8});
理解にかたくない
矢印関数
矢印関数はES 6関数の中で最もNiceの知識であるはずです.中国語の名前は「矢印関数」、英語の名前は「Lambda式」です.
矢印関数は、メソッドを宣言するときに、より簡単で便利にするためです.構文は次のとおりです.
let sum = (a, b) => {
return a + b;
};
矢印の左にパラメータリスト、右に関数メソッド体
関数にパラメータが1つしかない場合は、関数の方法をより簡略化できます.
let result = num => num * 2;
しかし、矢印関数を使うときは気をつけてください.矢印関数を使用すると、「役割ドメイン」という問題に関連します.この問題は通常、私たちのキーワードthisの値に影響します.
矢印関数内でthisが呼び出されるため、役割ドメインは矢印関数自体ではなく、矢印関数よりも大きなレベルの関数を指します.くりを一つあげる
let myInfo = {
name: 'janlay',
sayHello: () => {
console.log(`Hi,My name is ${this.name}`)
}
};
myInfo.sayHello();
このときコンソール出力undefined
私たちが言ったように、矢印関数内のthisは、その前の関数の役割ドメインを指します.しかし、彼は関数体を1層も持っていない.これを印刷してundefinedを表示します
概要の深さと浅さのコピー
まずこのようなコードを書きます
let myInfo = {
name: 'janlay',
age: 17
};
let heInfo = {};
heInfo = myInfo;
heInfo.name = 'Mike';
console.log(myInfo);
一般的な論理に従って、myInfoをheInfoにコピーします.それからheInfo内の属性を修正して、myInfoを出力しても変わらないはずです.
でも私たちは間違っています
{ name: 'Mike', age: 17 }
このようなオブジェクトコピーを「浅いコピー」と呼ぶ.メモリアドレスをコピーしただけで、新しい変数にコピーされたメモリはありません.
このような浅いコピーには、ES 6の「Object.assign()」メソッドもあります.彼の役割は、2つのオブジェクトを入力してマージし、3番目のオブジェクトに値を割り当てることです.
浅いコピーを使用することもありますが、一般的には深いコピーを使用します.つまり私たちがよく言う値伝達です
深いコピーの仕方が多い.私の学识が限られているため、みんなに1つの理解しやすい深いコピーの方法を持ってきます
1. JSON.parse()とJSON.stringifyメソッド
これは最も簡単な深いコピー方法だと思います.ソースオブジェクトをJSONオブジェクトに変換し、parseメソッドでオブジェクトに再解放するのが原理です.このように振り回されると、メモリアドレスが変わります.深いコピーの効果が得られます
let myInfo = {
name: 'janlay',
age: 17
};
let heInfo = {};
heInfo = JSON.parse(JSON.stringify(myInfo));
heInfo.name = 'Mike';
console.log(myInfo);
結果出力:
{ name: 'janlay', age: 17 }
2.外付けcloneの使用方法その原理も簡単で、オブジェクトを遍歴することで、オブジェクトの各値を新しいオブジェクトに個別にコピーし、全体的なコピーを行わない.オブジェクトの最小単位に分割
function clone(origin) {
let newObj = {}; //
for (let key in origin) { //
if (typeof origin[key] === 'object') { //
newObj[key] = clone(origin[key]) //
} else { //
newObj[key] = origin[key]; // ,
}
}
return newObj; //
}
heInfo=clone(myInfo)を呼び出します.
結果出力は
{ name: 'janlay', age: 17 }
以上の2つの深いコピー方法は非常に簡単です.より深い深いコピーを知るように、ここでは金を掘る別の文章をお勧めします.深いコピーの究極の探求(90%の人は知らない)
The End
Babel中国語ネット-ES 6オンライン変換ES 5ツール