文章目录
解构赋值
按照某种模式将数组或对象中的值赋给变量称为解构。
解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。
由于undefined
和null
无法转为对象,所以对它们进行解构赋值,都会报错。
数组的解构
只要等号左右两边的解构相同。左侧的变量就会赋予对应的值。
实例:
let [num1,num2] = [1,2] // num1=1 num2=2 完全解构
let [num1,num2] = [1,2,3] // num1=1 num2=2 不完全解构
let [num1,[num2],num3] = [1,[2,3],4] // num1=1 num2=2 num3=4 不完全解构
let [num1,,num2] = [1,2,3] // num1=1 num2=3 不完全解构
**注**
不完全解构是指等号左边的模式只匹配一部分等号右边的数组。
解构不成功,变量的值为undefined
let [num1] = [] // num1=undefined
let [num1,num2] = [1] // num1=1 num2=undefined
设置默认值
解构的时候可以设置默认值,默认值只有在匹配的数组成员严格等于
undefined的时候才会生效。
let [num1=1] = [null] // num1=null
let [num1=1] = [undefined] //num1=1
默认值引用解构赋值的其它变量
默认值可以引用解构赋值的其它变量,但是该变量在引用的时候必须已经声明。实例:
let [num1=1,num2=num1] = [1,2] // 正确
let [num1=num2,num2=2] = [1,2] // 错误
对象的解构赋值
基本用法实例:
let {name,sex} = {name:'张三',sex:0} // name='张三' sex=0
解构失败变量的值为undefined
let {name} = {address:'中国北京',hobby:'跑步'} // name=undefined
对象解构赋值注意
对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。实例:
let {name:aliasName} = {name:'张三'}
/* aliasName='张三' 真正被赋值的是aliasName,而不是name。
name只是一种匹配模式,aliasName才是真正的变量。*/
// 对已声明的变量结构赋值时需要特别注意
let userName = '张三'
{userName} = {userName:'李四'}
/* 上面代码会报错,因为 {userName} 存在歧义。
js会把它理解成代码块,解决方法是使用括号括起来。如下*/
({userName} = {userName:'李四'})
对象解构使用默认值
let {name='张三'} = {name:'李四',sex:1} // name='李四'
let {name='张三'} = {} // name='张三'
let {name:aliasName='张三'} = {name:'李四',sex:1} // aliasName='李四'
注意:
默认值生效的条件是,对象的属性值严格等于
undefined
函数参数的结构赋值
function add([num1,num2]){
return num1+num2
}
let sum = add([1,5]) // sum=6
function add1({num1,num2}){
return num1+num2
}
let sum1 = add1({num1:6,num2:8}) // sum1=14
函数参数的默认值
[1, undefined, 3].map((x = 'hello') => x);
// [ 1, 'hello', 3 ] undefined 触发函数参数的默认值。
字符串的解构赋值
字符串解构赋值时,字符串被转换成了一个类似数组的对象。
let [a,b,c] = 'hello' // a='h' b='e' c='l'
let {length} = 'hello' // length = 5
let {length:len} = 'hello' // len=5 类似数组的对象都有一个length属性