按必定的匹配模式,從數組或對象中解構出相應值,並賦值給變量。數組
let [a] = [3]; // a = 3 let [, a] = [3, [7]]; // a = [7] let {a} = {a: 3}; // a = 3,{a} 至關 {a: a} let {a: {b}} = {a: {b: 3}}; // b = 3
快速的聲明並賦予相應的屬性值函數
// --- 之前 let id = obj.id; let name = obj.name; let ago = obj.ago; // --- 如今 let { id, name, ago } = obj;
函數配置參數的解構和賦默認值code
// --- 之前 function dealUser(id, conf) { let name = conf.name || ''; let ago = conf.ago || 0; } // --- 如今 // 能夠直接使用 name 等,以及設置默認值(類型也易見)。 function dealUser(id, { name = '', ago = 0 }) { // 函數體 }
當解構的目標爲非對象時,會將目標轉化成相應類型的對象。 NaN
能夠使用Number
構造函數生成,能夠被解構。 null
和undefined
是單值,沒有相應的構造函數,不能被解構。對象
let {length: a} = 'ab'; // a = 2 // 等價於 let {length: a} = new String('ab'); // a = 2 let {toString: a} = NaN; // a = function let {toString: a} = null; // 報錯
左側的解構符決定如何看待右側的解構值。
解構符{}
意味着視右側的值爲對象,採用對象解構。
解構符[]
意味着視右側的值爲數組,採用數組解構。
以此能夠推斷:數組即支持數組解構也支持對象解構。接口
原生類數組對象有迭代接口,也支持兩種解構。(arguments
, NodeList
, new String()
)io
let [a] = 'ab'; // a = 'a',a 爲第一個元素。 let {length: a} = 'ab'; // a = 2 let {length: a} = ['a', 'b']; // a = 2 let [a] = {0: a, length: 1}; // 報錯,自定義對象沒有迭代接口。
右側沒有相對應的值,解構不報錯,變量值爲undefined
。function
let [a, b] = [1]; // a = 1, b = undefined
當右側值(包括轉換後)不知足左側要求的類型時,解構失敗。class
let [[a]] = [1]; // 報錯,目標 1 不是數組。 let [a] = {a: 3}; // 報錯,目標 {a: 3} 不是數組。
能夠爲待賦值的變量指定默認值。
默認值能夠使用解構中其餘變量,但該變量的解構必須在此以前。變量
let [a, b = 2] = [1]; // a = 1, b = 2 let [a, b = a] = [1]; // a = 1, b = 1