ES6-アレイの破棄と割り当て
ES6の非構造化の定義により、特定のパターンに従って配列とオブジェクトから値を抽出し、変数に値を割り当てることができます。
以前は、変数に値を割り当てることは、直接指定することしかできませんでした。たとえば、次のようになります。
let a=1;
let b=2;
let c=3;
ES6では破壊的割り当てが導入されたため、変数は次のように定義できます。
let [d, e, f] = [4, 5, 6];
console.log(d, e, f); //4 5 6
console.log([d, e, f]); //[4,5,6]
上記のコードは、配列から値を抽出し、対応する位置に従って変数に値を割り当てます。本質的に、このタイプの書き込みはパターンマッチングに属します。等号の両側のパターンが、同様に、左側の変数には対応する値が割り当てられます。
- 配列の非構造化の割り当てはネストできます。非構造化が失敗した場合、変数の値はundefinedを返します。
let [x, [y, z]] = [1, [2, 3]];
console.log(x, y, z); //1 2 3
let [, , third] = ['a', 'b', 'c'];
console.log(third); //'c'
let [head, ...tail] = [1, 2, 3, 4, 5];
console.log(head, tail); //1 [2,3,4,5]
let [m, n, ...o] = ['a'];
console.log(m); //'a'
console.log(n); //undefined
console.log(o); //[]
- 不完全な分解等号
の左側のパターンは、等号の右側の配列の一部にのみ一致します。この場合でも、分解は成功する可能性があります。
let [g, h] = [1, 2, 3];
console.log(g); //1
console.log(h); //2
console.log([g, h]); //[1,2]
- 割り当てを破棄すると、デフォルト値を指定できます
let [foo = true] = [];
console.log(foo); //true
let [x1, y1 = 'b'] = ['a', undefined];
console.log(x1); //'a'
console.log(y1); //'b'
- ES6は、内部的に厳密な等式演算子 '==='を使用して、位置に値があるかどうかを判別します。したがって、配列メンバーがundefinedと厳密に等しくない場合、デフォルト値は有効になりません。
let [x2 = 1] = [undefined];
console.log(x2); //1
let [x3 = 1] = [null];
console.log(x3); //null
- デフォルト値が式の場合、式は遅延評価されます。つまり、使用された場合にのみ評価されます。
function fn() {
console.log('aaa');
}
let [x4 = fn()] = [1];
console.log(x4); //1(x4能取到值,所以函数fn()根本不会执行)
/* 以上代码等价于 */
// let x4;
// if (([1][0]) === undefined) {
// x4 = fn();
// } else {
// x4 = [1][0];
// }
// console.log(x4);//1