- 數組的解構賦值 var [a,b,c] = [1,2,3]; 左邊是變量,右邊是值,根據數據結構一一對應
- 只要等號兩邊的模式相同,左邊的變量就會被賦予右邊對應的值,必須模式相同
- 如果等號右邊的不是數組,確切的說不是可遍歷的數組,那么將會報錯
- 解構賦值不僅適用於var 命令,也適用於 let / const 命令
-
var [a,b,c,...d] = []; let [a,b,c,...d] = []; const [a,b,c,...d] = [];
-
- 只要是可遍歷的數據,都可以使用數組的解構賦值:
- let [a,b,c] = new set(["1","2","3"]);
- 解構賦值同樣允許指定默認值 let [a = "1",b] = [2]; //a=1 b=2
- 默認值可以引用其它變量,但是該變量必須已經聲明
- 對象的解構賦值 var {a,b} = {a: "1", b:"2"} 左邊是變量名,右邊是給屬性賦值的對象列表,變量名必須與屬性性名一致,才能取到正確的值,與次序完全沒關系。
- 對象的解構賦值與數組有一個重要的不同,數組元素在解構賦值時,是按照次序排列賦值的,變量的值由位置決定;而對象沒有次序,變量必須與屬性性同名,才能取到正確的值
- 如果變量名與屬性名不一致,必須把不一致的屬性作為屬性值賦值給有值的屬性:
-
let {a: d} = {a:"1",b:"2"}; d //1
-
- 對象的解構賦值的機制是:先找到同名屬性,然后再賦值對應的變量。真正被賦值的是后者,而不是前者。上面的代碼中,真正被賦值的是 d,而不是 a
- let 在聲明變量之后,不可以再重復聲明,如果想要重復聲明,必須將再次聲明的變量與賦值語句用圓括號括起來,否則會報錯。使用圓括號的原因是,解析器會將起首的大括號,理解成一個代碼塊,而不是賦值語句
-
let a; ({a} = {a:"1"}); //OK let b: ({c:b} = {c:"2"}); //OK
let c:
{c} = {c: 1} //error
({c} = {c:1}); //OK
-
- 對象的賦值表達式,也主是賦值語句,如果放在圓括號里,在大部分場景下都可以執行,如果不放在圓括號里,嚴格模式下是會報錯的。
- 對象的解構賦值同樣也可以指定默認值: let {a=""3} = {}
- 對象的解構賦值,可以很方便的將現有對象的方法,賦值到某個變量
-
function logo(){...} function setData(){...} function list(){...} 可以很方便的將上面的三個方法,賦值給一個變量: let {logo,setData,list} = Match;
-
- 字符串的解構賦值 const [h,e,l,l,o] = 'hello' 字符的解構賦值是把字符串轉換成了類似數組的對象,它有length屬性值,只是類數組,數組的方法不可以用在類數組上
- 數值和布爾值的解構賦值:如果等號右邊的是數值或布爾值,要先轉換為對象再賦值。解構賦值的規則是,只要等號右邊的不是對象,就先將其轉換為對象(undefined與null無法轉為對象,所以無法對它們進行解構賦值)
- 函數的參數也可以進行解構賦值,函數的參數也可以使用默認值
怎么讓解析器判斷,一個語句,到底是模式還是表達式,沒有辦法從一開始就知道,必須解析到等號才能知道。ES6的規則是:只要有可能導致解構歧義,就不要在模式中放置圓括號。建議,只要有可能,就不要在模式中使用圓括號。不能使用圓括號的三種情況:
- 變量聲明語句中,不能帶有圓括號,不能給變量添加圓括號
-
var [(a)] = [1] //錯
-
- 函數參數中使用解構賦值時,不能給函數參數使用圓括號
-
function([(a)]){return a} //錯
-
- 賦值語句中,不能將模式中的一部分或一層,放入圓括號
-
({a:"1"}) = {a:"100"} //錯 ({a: "1"} = {a:"100"}) //正確
-
- 可以使用圓括號的情況:首先是賦值語句
- 可以使用賦值語句的情況只有一種:賦值語的非模式部分,可以使用圓括號
-
[(a)] = [3]; // 正確 ({ a: (b) } = {}); // 正確 [(parseInt.prop)] = [3]; // 正確
-
- 之所以能使用,是因為它們首先是賦值語句,而不是聲明語句;
- 其次,它們的圓括號都不屬於模式的一部分
- 變量的解構賦值的用途
- 交換變量的值
- 從函數返回多個值 返回多個數組方法: let [a,b,c] = example(); 返回多個對象方法: let {a,b} = example();
- 函數參數,可以很方便的將參數與變量名對應起來
- 提取JSON數據: let {id,status,data:number} = jsonData;
- 遍歷數組結構,很方便的獲取鍵名或鍵值 for(let [key, value] of map){...} 獲取鍵名: for(let [key] of map){...} 獲取鍵值: for(let [value] of map){...}
- 加載模塊指定, import {render} from 'react-dom';