ES 6における配列とオブジェクトの解構付与


配列の解体代入
ES 6は、一定のパターンに従って配列やオブジェクトから値をとる、変数を付与することを解構と呼ぶ.
たとえば、以前にいくつかの変数に値を割り当てた場合、次のように1つの変数に値を割り当てることができます.
let a = 1;
let b = 2;
let c = 3;

このような操作は簡単であるが、規則性もあり、単純な変数を宣言して値を付与するだけである.ES 6になると、新しい標準と技術実装案があり、これらの操作を簡素化することができます.
let [a,b,c] = [1,2,3];

このような書き方は、等号(=)の両側のパターンが同じである限り、等号の左側の変数に対応する値が付与されるパターンマッチングに属する.
let [a,[[b],c]] = [1,[[2],3]];
a //1
b //2
c //3

解体に失敗すると、変数の値がデフォルト値undefinedに設定されます.
let [a] = [];
console.log(a); //undefined

不完全解构:等号左侧のパターンは等号右侧の配列の一部しか一致せず、この时も解构に成功するが、等号右侧の配列の値は左侧の変数に完全に付与されていない.
let [a,[b,c]] = [1,[2],3];
console.log(a); //undefined
console.log(b); //2
console.log(c); //undefined

左側のモードcは右側の値に一致する、右側には値3があり、左側にもモードが一致していないが、この場合は一致に成功するが、この場合、左側のモードcは右側に対応する一致値を見つける、右側の値3も左側に一致するモードを見つける.この場合を不完全解構と呼ぶ.
しかし、等号の右側が配列でない場合(厳密には、遍歴不可能な解であるべきであり、オブジェクトの解もあるため)、解は誤報する.
let [a] = 12;
let [b] = false;
let [c] = null;
let [d] = undefined;
let [e] = NaN;
let [f] = {};

これらの場合の解構は、{}is not iterableのように、等号右側の値がオブジェクトに変換する後にiterableインタフェースを備えていないため、遍歴できないため、誤りを報告する.
デフォルト
デフォルト値を指定できるようにします.
let [a = 12,b] = [];
console.log(a); //12
console.log(b); //undefined


let [a,b = 12] = [11]
console.log(a); //11
console.log(b); //12

解構賦値では、配列内の値がundefinedに厳密に等しい場合にのみデフォルト値が有効になる.
let [a = 1] = [undefined];
console.log(a);  //1
let [b = 2] = [null];
console.log(b); //2 null      undefined,         

デフォルト値が式である場合、この式はデフォルト値に使用する場合にのみ実行される不活性評価である.
function f(){
    return "Hello world";
}
let [c = f()] = [1];
console.log(c); //1             c  ,             

function f(){
    return "Hello world";
}
let [c = f()] = [1];
console.log(c); //Hello world             c  ,        

デフォルト値は、付与値を解く他の変数を参照することもできるが、この変数が宣言する必要があることを前提とする.
let [a = 1,b = a] = [];
console.log(a); //1
console.log(b); //1   b     a,a     

let [a = 1,b = c] = [];
console.log(a);
console.log(b);
//           ,     ,       b       c      ,     c     ,      

オブジェクトの解体代入
配列は賦値を解くことができ、オブジェクトは賦値を解くことができるが、配列とは少し異なるのは配列の要素が順番に配列されていることであり、変数の取値はその位置によって決定されるが、オブジェクトの属性には順序がなく、変数は属性と同名でなければ正確な値に一致しない.
let {a,b} = {b:12,a:"Nicholas"};
console.log(a);//Nicholas
console.log(b); //12   demo    ,                             ,                 ,                 

オブジェクトの解構賦値は,我々がオブジェクトの解構賦値を学習する際に,まずES 6におけるオブジェクトの拡張部分を学習することができる.オブジェクト拡張部の後に補足する.