解构赋值
数组的解构赋值
- ES 6 中支持的数组解构赋值
var [a,b,c] = [4,5,6];
、let [foo,[xxx,yyy]]=[45,[12,46]];
,只需要等号两边的模式相同,变量就会被赋予对应的值。 - 若是解构不成功,变量的值就等于
undefined
。 - 不完全解构的情况,也可以进行赋值
let [x,y] = [1,2,6];
或者let [x,y,z] = [4,[4,9,3],8,9];
。 - 若等号的右边,不是可遍历的结构,使用解构赋值时候将会发生报错。
- 只要某种数据具有
Iterator接口
都可以以数组的形式进行解构赋值。例如let [x,y,z] = new Set ([4,5,6]);
,以及ES 6 中的generator
函数,也可以作为解构表达式的赋值内容。
解构赋值中的默认值
let [foo = true,ofo = false ,mobike = "fake"] = [456,undefined,null];
只有当一个数组成员被赋予的值全等于undefined
,默认值才会生效。(注:这里的null并不全等于undefined,所以mobike的值为null)。- 解构赋值中的默认值赋值表达式,只有在“有必要(即所赋值为undefined)”的时候才会执行。例如
let [foo = fun()] = ["Crazy-Web-2"];
这里的fun()方法将不被触发。 - 使用默认值时,所赋值的内容,必须是已被声明的变量 例如
let [x=y,y=1]=[];
,给x赋默认值的时候,仍未被声明。
对象的解构赋值
- 变量名称的次序不要求与赋值名称的次序相同,只要键名相对应即可。
- 对于
var {foo: baz } = { foo:"aaa",bar :"bbb"};
,被赋值的是变量baz
而不是键名foo
- 使用let关键字进行对象解构赋值的时候,同样需要注意不能重复声明。
- 和数组的类似,对象的解构赋值,也可以进行复杂的嵌套结构
- 若解构失败,变量的值被赋予
undefined
- 若使用解构的方式,将一个已经声明的某个变量赋值,例如:
({x} = { x : x:1});
,需要十分注意,要使用圆括号括起来。 - 可以利用已知的JS内置对象的键名,去获取JS内置对象的方法,例如
let { log, sin, cos } = Math;
,能够,直接使用log()
、sin()
、cos()
即可。
字符串的解构赋值
- 字符串一般可以当做一个类似数组一样的对象,可将数组中的元素内容按序赋值。
- 也可以将字符串对象的属性用于赋值,例如,类数组对象都有一个
length
属性,字符串对象也不列外。
其他基本对象的解构赋值
结构的规则一般是,若等号右边不是数组或者JS对象,就将其转化为对象,然后将其当做一个完整的对象,进行对象属性的对照,再进行结构赋值。
- Number对象、Boolean对象都会解构成一般的对象,拥有对象的基本属性。
- undefined和null都无法转换为JS对象,所以对他们进行结构赋值的时候,都会报错。
函数参数的解构赋值
- 函数调用进行传参的时候,也是一个解构赋值的过程
- 在给解构赋值设定默认值的时候,要与函数设定默认值的情况区分开来:
例如function move({x = 0, y = 0} = {}) {
return [x, y];
}
与function move({x, y} = { x: 0, y: 0 }) {
return [x, y];
}
区别就是在于,调用时传入的值为undefined
时,解构默认值会被触发,而函数参数默认值不会。
使用解构赋值的注意点
- 在声明语句中,不能够使用圆括号
- 函数设定参数的时候,也不能够使用圆括号
- 赋值语句中,不能将整个模式,或嵌套模式中的一层,放在圆括号之中。
// 报错
({ p: a }) = { p: 42 };
([a]) = [5];
[({ p: a }), { x: c }] = [{}, {}];
解构赋值的用途
- 不借助中间值,实现两个变量值互换。
let x = 1;
let y = 2;
[x, y] = [y, x];
- 从函数中返回多个值,可以使用返回数组/对象的形式,例如
return [1, 2, 3];
或return { foo: 1, bar: 2 };
,return得到的函数值,可以直接赋值给解构相类似的对象。 - 使用JS对象传参的时候,可以实现变量无序传参。
function f({x, y, z}) { ... }; f({z: 3, y: 2, x: 1});
- JSON数据实现“键名”快速提取,因为JSON对象和JS对象的结构完全一致,可以使用键名直接提取,不需要像以前一样进行循环操作。
- 可以实现模拟函数参数值
let x = 1;
jQuery.ajax = function (url, {
async = true,
beforeSend = function () {},
cache = true,
complete = function () {},
crossDomain = false,
global = true,
// ... more config
}) {
// ... do stuff
};
- 遍历Map结构(有待补充)