解構賦值 陣列的解構賦值

2022-09-08 07:33:10 字數 2655 閱讀 8346

什麼是解構賦值?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 本質上,這種寫法屬於 模式匹配 只要等號兩邊的模式相同,左邊的變數就會被...