概述
- 解构赋值是对赋值运算符的扩展。
- 是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。
- 在代码书写上简洁且易读,语义更加清晰明了;也方便了复杂对象中数据字段获取。
通俗的来讲:解析数据源,然后按照数据模型进行取值,再赋值给变量
let obj={a:100,b:"hello",c:[10,203,0]
let {a,b,c}=obj就是解构赋值
//隐式操作:let a=obj.a;let b=obj.b;let c=obj.c
结构模型:
变量修饰符 数据模型=数据源
解构:
按照数据模型取出数据源中的数据,赋值:然后赋值给模型变量
做个练习吧:
- 写出var [name,{age}]=arr的隐式操作
//var a=arr[0], var b=arr[1], var c=arr[2]
- 写出var [a,b,c]=arr的隐式操作
//var name=arr[0],var age=arr[1].age
打印10,因为解构赋值其实是有两步隐式操作的,第一步: let a=10;第二步: let a=obj.a 此时obj.a是undefined所以原先的值没有被覆盖,就是其默认值。
如果我们给obj.a赋一个值,那麽此时打印a的话,之前a=10的值就被覆盖了,变更成了20,所以打印20.
如果我们将的值改为undefined呢?此时打印的还是10。这就是ES6解构赋值的一个bag,这里并不是obj.a没有值,而恰巧的是obj.a的值变成了undefined,这也是矛盾点所在。所以此时的情况就变成了第一个情况,obj.a的值是undefined所以其默认值没有被覆盖,还是10.
总结:赋值为没有意义得值时,只要值不是undefined,赋值为0、null都可以实现值得覆盖。
复杂的解构赋值:
写出隐式操作
对于这种复杂的解构赋值,唯一的解法就是一层一层的解。我们要打印出its
首先最外面是一个数组,所以要用下标取出来,下标取0,取出来的是一个对象;然后用点语法取出its: let its=data[0].its
加深难度,如果我们要取a呢?
a在its数组内,所以要用取下标的方法取出来: let a=data[0].its[0]
在加深难度,我们如果要取出b呢?
b是嵌套在its数组中的一个对象,所以我们要用点语法取:let b=data[0].its[1].b