1. 程式人生 > >陣列的解構賦值

陣列的解構賦值

基本用法

ES6允許按照一定的模式,從陣列和物件中提取值,對變數進行賦值,這被稱之為解構(Destructuring)

// 以前為變數賦值,只能直接指定值
var a = 1;
var b = 2;
var c = 3;

// ES6允許寫成這樣
var [a,b,c] = [1,2,3];

本質上,這種寫法屬於“模式匹配”,只要等號兩邊的模式相同,左邊的變數就會被賦予對應的值。
下面是一些使用巢狀陣列進行解構的例子:

let [foo,[[bar],baz]] = [1,[[2],3]];
foo // 1
bar // 2
baz // 3

let [,,third] = ["foo"
,"bar","baz"]; third // "baz" let [head,...tail] = [1,2,3,4]; head // 1 tail // [2,3,4] let [x,y,...z] = ['a']; x // "a" y // undefined z // []

預設值

解構賦值允許制定預設值

var [foo = true] = [];
foo // true

[x,y='b'] = ['a'];
// x='a', y='b'

注意,ES6內部使用嚴格相等運算子(===),判斷一個位置是否有值。
所以,如果一個數組成員不嚴格等於undefined,預設值是不會生效的。

var
[x=1] = [undefined]; x //1 var [x=1] = [null]; x // null

如果預設值是一個表示式,那麼這個表示式是惰性求值的,即只有在用到的時候,才會求值:

function f(){
  console.log('aaa');
}

let [x=f()] = [1];

上面的程式碼中,因為x能取到值,所以函式f()根本不會執行。上面的程式碼其實等價於下面的程式碼:

let x;
if([1][0] === undefined){
  x = f();
}else{
  x = [1][0];
}

預設值可以引用解構賦值的其他變數,但該變數必須已經宣告:

let [x=1,y=x] = [];
// x=1; y=1
let [x=1,y=x] = [2];
// x=2; y=2
let [x=1,y=x] = [1,2];
// x=1; y=2
let [x=y,y=1] = []; // ReferenceError

上面最後一個表示式,因為x用到預設值是y時,y還沒有宣告。