按必定的匹配模式,从数组或对象中解构出相应值,并赋值给变量。数组
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