ES6—数据解构
来同质化的代码 解构赋值表达式的值与表达式右侧(也就是=右侧)的值相等,如此一来,在任何可以使用值的地方都可以使用解构赋值表达式
–对应,有就有 没有就不存在
对象解构
1 2 3 4 5 6 7 8
| let myObj = { type:'name', value:'yongge' } let { type, value, name} = myObj console.log(type) // console.log(value) // console.log(name) // undefined
|
如果使用var、let、const解构声明变量,必须要提供初始化程序(也就是等号右侧的值),否则会导致程序抛出语法错误
解构出来的变量 一定要是 对象中能够查找到的属性名 当指定的属性不存在时,可以随意定义一个默认值,在属性名称后添加一个等号(=)和相应的默认值即可 (直接定义个默认值)
如果解构出来的属性在对象中查找不到,值为undefined
1 2 3 4 5 6 7 8
| let myObj = { type:'name', value:'yongge' } let { type, value, name='姓名'} = myObj console.log(type) // console.log(value) // console.log(name) // 姓名
|
解构出来的变量虽然是跟属性名称相同,但是他不再是属性,而是外部的变量,这个变量名也可以被修改, 不一定要跟属性同名
上面的都是同名的变量 为非同名局部变量赋值
假如想要换个变量 右边 大括号里面 重新申明下 xx:oo 旧的名称 : 新的名称
1 2 3 4 5 6 7
| let myObj = { type:'name', value:'yongge' } let { type:localType, value:localTValue} = myObj console.log(localType) // console.log(localTValue) //
|
嵌套对象解构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| let myObj = { type:'name', value:'yongge', child:{ firstObj:{ childType:'sex', childValue:'nan' }, secondObj:{ childType:'sex', childValue:'nv' } } } let {child:{firstObj:newObj}} = myObj console.log(newObj) //
|
先找一层 在进一层找 可以 点 属性获取值
数组解构
为需要的元素提供变量名
1 2 3 4 5 6 7 8 9
| let colors = ['red','green','blue'] let [firstColor,secondColor] = colors; console.log(firstColor);//"red" console.log(secondColor);//"green"
对于不需要的解构的值
let [ , ,thirdColor] = colors console.log(thirdColor);
|
如果我们先声明了变量,之后也可以直接通过解构赋值修改变量的值。
1 2 3 4 5
| let colors = ['red','green','blue'],firstColor = 'black',secondColor = 'yellow'; [firstColor,secondColor] = colors;
console.log(firstColor);//"red" console.log(secondColor);//"green"
|
可以在数组解构赋值表达式中为任意变量添加默认值。注意::::只有当该位置在右侧数组中的值不存在时或值为undefined时,默认值才会生效。
1 2 3 4 5 6
| let colors = ['red','green','blue']; [firstColor,secondColor,thirdColor='orange'] = colors;
console.log(firstColor);//"" console.log(secondColor);//"" console.log(thirdColor);//""
|
嵌套数组解构赋值
1 2 3 4 5 6 7 8
| let arr = [ 10, [ 20, 30 ], 40 ]; console.log( arr[1][1] ); //30
let [ one, two, three, four ] = arr; console.log( one, two, three, four ); //
[ one, [ two, three ], four ] = arr; // console.log( one, two, three, four ); //10 20 30 40
|
字符串的解构赋值
字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。
1 2 3 4 5 6
| const [a, b, c, d, e] = 'hello'; a // "h" b // "e" c // "l" d // "l" e // "o"
|
类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值
1 2
| let {length : len} = 'hello'; len // 5
|
数值和布尔值的解构赋值
解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。
1 2 3 4 5
| let {toString: s} = 123; s === Number.prototype.toString // true
let {toString: s} = true; s === Boolean.prototype.toString // true
|
上面代码中,数值和布尔值的包装对象都有toString属性,因此变量s都能取到值。
解构赋值的规则是,只要等号右边的值不是对象,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错。
1 2
| let { prop: x } = undefined; // TypeError let { prop: y } = null; // TypeError
|
解构交换变量值
1 2 3
| let a =10 , b = 8; [a,b]=[b,a] console.log(a,b)
|
解构中的不定参数(…)
1 2 3
| let arr =[10,20,30] let [first,...others ] = arr console.log(first,others)
|
复制数组
ES5
1 2 3
| let arr = [ 10, 20, 30 ]; let newArr = arr.concat(); console.log( newArr );
|
用解构与不定参数结合 复制 数组
ES6
1 2 3
| let arr = [ 10, 20, 30 ]; let [...newArr] = arr; console.log( newArr );
|
解构表达式传参
方法 可以接受 解构表达式
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| function show ({name,age}){ console.log(name,age) } let obj = { name:'yongge', age:'28' } show (obj) //函数里面可以写成表达式 {name,age} = obj
function add([x, y]){ return x + y; }
add([1, 2]); // 3
|
函数show,add的参数表面上是一个数组,但在传入参数的那一刻,数组参数就被解构成变量x和y。对于函数内部的代码来说,它们能感受到的参数就是x和y。