陣列的解構賦值
阿新 • • 發佈:2019-02-14
基本用法
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
還沒有宣告。