什麼是解構賦值?es6 允許按照一定模式,從陣列和物件中提取值,對變數進行賦值,這被稱為解構(destructuring)。我的理解是:允許宣告一種模式(陣列、物件等),裡面包含乙個或多個變數,再分別對這些變數遍歷(按照對應位置)賦值。
以前,為變數賦值,只能直接指定值。
let a = 1;
let b = 2;
通過解構賦值:
let [a, b] = [1, 2]
這和上面分別宣告是一樣的。從後面陣列中按照對應位置分別給變數賦值,允許值比變數多,稱為不完全解構,多出的部分不用管,如果變數比值多,則解構不成功,變數的值就是undefined,比如:
let [a, b, c] = [1, 2, 3, 4, 5]
a //1 b //2 c //3 而4,5就不用管了;
let [a, b, c,] = [1, 2]
a //1 b //2 c //undefined
但有一種情況,以...name這樣宣告的變數,雖然沒有對應的值,也會為其賦值空(要看前面的前面的資料型別,比如空陣列或空物件):
let [a, b, ...c] = [1]
a //1 b //undefined c //
本質上,這種寫法屬於「模式匹配」,只要等號兩邊的模式相同,左邊的變數就會被賦予對應的值。下面是一些使用巢狀陣列進行解構的例子。
let [a, [[b], c]] = [1, [[2, 3], 4]];
a //1 b //2 c //4
let [ , , str] = ['a', 'b', 'c']
str // 'c'
let [a, ...b] = [1, 2, 3, 4] 這中...name的形式叫做擴充套件運算子,後面再詳細介紹。
a //1 b //[2, 3, 4]
let [a] = 1;
let [a] = false;
let [a] = nan;
let [a] = undefined;
let [a] = null;
let [a] = {};
以上這些都會報錯,因為等號右邊的值(模式),轉換成物件後不具備 iterator 介面(前5個),要麼本身就不具備 iterator 介面(最後乙個)。
對於 set 結構,也可以使用陣列的解構賦值:
set結構:es6提供的新的資料結構,它類似於陣列,但是成員的值都是唯一的,沒有重複的值。set函式可以接受乙個陣列(或類似陣列的物件)作為引數,用來初始化。
let [x, y, z] = new set(['a', 'b', 'c']
x //'a' y //'b' z //'c'
事實上,只要某種資料結構具有 iterator 介面,都可以採用陣列形式的解構賦值。
function* fibs () {
let a = 0;
let b = 1;
while (true) {
yield a;
[a, b] = [b, a+b];
let [num1, num2, num3, num4, num5] = fibs();
num5 //5
上面**中,fibs
是乙個 generator 函式,原生具有 iterator 介面。解構賦值會依次從這個介面獲取值。後面再詳細介紹generator函式。
解構賦值允許指定預設值。就是在等式左邊宣告變數的時候就賦值,如果右邊有對應位置又和預設值不一樣的話,預設值就會被改變。
let [foo = true] = ;
foo //true;
let [x, y = 'b'] = ['a'];
x //'a' y //'b'
直接在左邊宣告變數等於undefined時,右側對應位置沒有值,得到的會是undefined,如果左邊有預設值,有面對應位置是undefined,則還是取預設值,不會被undefined取代。上面說到到,如果左側只宣告為賦值,右側也沒有對應值,將取undefined。
let [x = 1] = [undefined];
x //1;
let [x = 2] = [null];
x //null
上面**中,如果乙個陣列成員是null
,預設值就不會生效,因為null
不嚴格等於undefined
。
如果預設值是乙個表示式,那將會在用到時候才會求值,這個表示式稱為惰性求值。
function f () {
console.log('hello');
let [a = f()] = [1];
上面這個**,因為a能取到值,所以函式就不執行。
預設值可以引用解構賦值的其他變數,但該變數必須已經宣告。
let [x = 1, y = x] = ; x = 1; y = 1;
let [x = 1, y = x] = [2]; x = 2; y = 2;
let [x = 1, y = x] = [2, 3]; x = 2; y = 3;
let [x = y, y = 1] = [1]; referenceerror,報錯為定義
其實就是右側有值的話,就會改變對應左側位置的變數的值,但預設值但變數需要提前宣告,否則就會報錯,就是變數第一次出現時,不能出現在『=』右側,比如最後這個。
陣列的解構賦值
es6允許按照一定的模式,從陣列和物件中提取值,對變數進行賦值,這被稱之為解構 destructuring 以前為變數賦值,只能直接指定值 var a 1 var b 2 var c 3 es6允許寫成這樣 var a,b,c 1,2,3 本質上,這種寫法屬於 模式匹配 只要等號兩邊的模式相同,左邊...
陣列的解構賦值
es6 允許按照一定模式,從陣列和物件中提取值,對變數進行賦值,這被稱為解構。es5宣告變數 let a 1 let b 2 let c 3 es6解構賦值 let a,b,c 1,2,3 本質上,這種寫法屬於 模式匹配 只要等號兩邊的模式相同,左邊的變數就會被賦予對應的值。下面是一些使用巢狀陣列進...
陣列的解構賦值
以前的寫法.為變數賦值,只能直接指定值 let a 1 let b 2 let c 3 es6的允許寫法 let a,b,c 1,2,3 從陣列中提取值,按照對應位置,對變數賦值 console.log a,b,c 1,2,3 本質上,這種寫法屬於 模式匹配 只要等號兩邊的模式相同,左邊的變數就會被...