ES6语法(3)——变量的解构赋值
变量的解构赋值
ES允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构
(Destrucuring)
基本用法
1、数组的解构赋值。
情况一: 模式匹配
:只要等号两边的模式相同,左边的变量就会被赋予相应的值。
1
2
3
4
5
6 //es5
let a = 1;
let b = 2;
let c = 3;
//es6
let [a,b,c] = [1,2,3];
情况二:不完全解构
:即左边的模式,只匹配一部分等号右边的数组。这种情况,解构依然可以成功。反过来则不行,元素值为undefined
1
2
3
4
5
6
7let [a,b] = [1,2,3]
//a:1
//b:2
let[a,[b],c] = [1,[2,3],4]
//a:1
//b:2
//c:4
情况三:等号的右边不是数组,那么将会报错
1
2
3
4
5
6
7//都会报错,因为等号右边的值,要么转为对象以后不具备Iterator接口(前五个),要么本身就不具备Iterator接口(最后一个表达式)
let [foo] = 1;
let [foo] = false
let [foo] = NaN;
let [foo] = undefined;
let [foo] = null
let [foo] = {}
情况四:默认值:
解构赋值允许指定默认值,注意,ES6内部严格相等运算符(===
),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined
,默认值才会生效。1
2
3
4
5let [foo = true] = [];
foo //true
let [x,y='b'] = ['a'] //x='a',y = 'b'
let [x,y='b'] = ['a',undefined] //x='a',y = 'b'
let [x= 1] = [null]
2、对象的解构赋值
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。1
2
3
4
5let {bar,foo} = {foo:"aaa",bar:"bbb"}
bar //"bbb"
foo //"aaa"
let {paa} = {foo:"aaa",bar:"bbb"}
paa //undefined
3、字符串的解构赋值
字符串也可以解构赋值,这是因为此时,字符串转换成了一个类似于数组的对象。1
2
3const [a,b,c,d,e] = "hello"
a //"h"
b //"e"
类似数组的对象都有一个length
属性,因此还可以对这个属性解构赋值1
2let {length:len} = 'hello'
len //5
4、数值和布尔值的解构赋值
解构赋值时,如果等号右边是数值和布尔值,则先会转为对象。1
2
3
4
5//数值和布尔值的包装对象都有toString属性,因此变量s都能取到值。
let {toString :s} = 123
s === Number.prototype.toString //true
let {toString :s} = true
s === Number.prototype.toString //true
解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象,由于undefined
和null
无法转为对象,所以对他们进行解构赋值,都会报错。1
2let {prop:x} = undefined //TypeError
let {prop:y} = null //TypeError
4、函数参数的解构赋值
函数的参数也可以使用解构赋值
1 | function add([x,y]){ |
函数参数的解构也可以使用默认值。
用途
- 交换变量的值:[x,y] = [y,x]
- 从函数返回多个值: return [a,b,c]
- 函数参数的定义: f([1,2,3])
- 提取json数据: let {errCode,errText} = {errCode:’200’,errText:’success’}