ES6结构赋值,一篇就够

1.基础铺垫(传统赋值取值方式)

var a = [1,2]
var person = {
    
    name:"fanfusuzi",sex:"man"}

(1)变量的申明和赋值:

可以理解上面的代码分为这两步: var a; a=[1,2]  
因为声明变量都会出现变量名的提升(声明变量这句代码会被提升到生效作用于最前面)
var声明的是全局变量,而let const声明的是块级作用域

(2)以往传统的取值方式

 数组按照值的所在位置进行取值,eg:a[0]、a[1]
 对象按照属性的名字进行取值:eg: person.name、person.sex

(3)为什么会出现结构赋值

实际的开发中后台传的值是嵌套很多层的,
按照传统的方式进行取值会让人很难受,eg: a.b.c.d.n

2.结构赋值

相较于常规的赋值方式,结构赋值最主要的是’解构’两个字,在赋值的过程中要清晰的知道等号右边的结构,解构顾名思义就是:解开结构

(1)语法:

数组: let [a] =[1]   [变量名]:变量名可随意
对象: let {name} = {name}  {变量名}:变量名必须是对象中的属性名

(2)结构对应:

口诀:数组(要位不要名), 对象(要名不要位)

(3)完全结构
数组:

按顺序: let [a,b,c] = [1,2,3]; console.log(a,b,c); //1,2,3
打乱顺序: let [b,a,c] = [1,2,3]; console.log(a,b,c); //1,2,3
 数组的是按照位置来进行结构的,所以与变量名字无关

对象:

按顺序: let {
    
    name,sex} = {
    
    name:"fanfusuzi",sex:"man"}; console.log(name,sex); //fanfusuzi,man
打乱顺序: let {
    
    sex,name} = {
    
    name:"fanfusuzi",sex:"man"}; console.log(sex,name); //nan,fanfusuzi
 对象是按照属性名字进行结构的,所以与变量的位置无关
不存在的属性名: let {
    
    name,age} = {
    
    name:"fanfusuzi",sex:"man"}; console.log(name,age); //fanfusuzi,undefined

(4)嵌套结构
数组

let [a, [b,c], d] = [1, [2, 3], 4];
console.log(a,b,c,d)
//1,2,3,4
//结构和位置一一对应就行了.

对象

const obj={
    
    
    man:{
    
    
      student:{
    
    
           name:'ning',
           age:18
        }
   }
}
 
let {
    
    man:{
    
    student}} = obj //obj里面有个man,然后里面有个student,注意这一行代码里变量就只有一个student,并没有man
console.log(man,student) // undefined,{name:'ning',age:18}
let {
    
    man:{
    
    student:{
    
    name}}} = obj //同理,逐层拿到最后的name值,而且也只有name这一个属性
console.log(name) //ning
 
//如何同时拿到嵌套的每层的数据
let {
    
    man,man:{
    
    studengt},man:{
    
    student:{
    
    name}}} = obj
console.log(man,student,name) //{student:{name:'ning',age:18}},{name:'ning',age:18},18

(5)不完全结构

let [a, b] = [1, 2, 3];
console.log(a,b,c)
//1,2
//这里变量只有两个,但是数组中元素有三个.这里还是根据位置对应原理就行.a表示数组中的第一个元素,b表示第2个.而第三个元素我不要.
let [a, [b], d] = [1, [2, 3], 4];
console.log(a,b,d)
//1,2,4 数组的多层嵌套直接仿照嵌套的机构,根据想要结构的给变量名即可
//嵌套解构同样也可以不完全解构,根据实际需要,需要哪个就解构赋值哪个
let [, , c] = [1, 2, 3];
console.log(c)
//3
//注意这里是完全解构,只不过前两个元素我虽然解构了,但是我不要.因为位置对应的关系,所以必须有两个占位的,才能拿到第三个.
//放在这里是为了方便理解为啥前面两个明明不要还得写两个','

let [a,b,c,d] = [1,2,3]
onsole.log(a,b,c,d)
//1,2,3,undefined
//因为前三个元素都能对应找到,而第四个找不到,但是已经声明了,没有值.
//对象同理,如果出现了对象中没有的属性就会得到undefined

(6)重命名(先取再重命名)
数组:我们上面说过,数组解构的时候只要注意位置对应就行了,名称啥的无所谓,你喜欢叫什么变量名就什么变量名
对象:对象解构的时候是要属性名对应才能取到值.但是没有说取到值之后不能重命名啊.一定要取到值之后在命名

let {
    
    name:myName,age} ={
    
    name:'ning',age:18}
//这里name:myName的意思是:取到name属性值,冒号后面的变量名没有花括号,意思是把我取到的值交给冒号后面的变量名,即'myName'.相当于把name变量重命名为myName
/**而student:{name},同样是'属性名:'意思一样,取里面对应的属性,冒号后面还有花括号,所以再解构,取student里面的name属性/
console.log(name,myName,age)
//undefined,ning,18

(7)默认值(先取再默认)
数组:

let [a=0, b=0,c=10] = [1, 2];
console.log(a,b,c) //1,2,10
//这里a,b,c在左边都先给了个默认值,但是这里是变量超过了实际的数据,a和b都成功取到值,但是c没取到,所以最终是默认值10,如果没有默认值就是undefined

对象:

let {
    
    name:sex='男'} ={
    
    name:'ning',age:18}
console.log(sex)  //ning  取到了name值并且重命名为sex然后默认值为男
let {
    
    name:{
    
    sex='男'}} = {
    
    name:'ning',age:18}
console.log(sex)  //男
//这里刚好通过这两个例子区分一下重命名和嵌套

3.字符串结构

字符串的解构可以理解为一维数组的解构,这在处理字符串的时候特别方便.

let [a,b,c] ='123'
console.log(a,b,c,typeof c)  //1,2,3,string   解构出来的是字符类型的数据 长度
let {
    
    length:s} ='123'
console.log(s,typeof s) //3,number 
//同理,数组也有长度
let {
    
    length:s} = [1,2,3]
console,log(s,typeof s) //3,number

4.函数参数自动结构

function look([x,y]){
    
    
console.log(x,y)
}
look([1,2]) //1,2

猜你喜欢

转载自blog.csdn.net/weixin_43131046/article/details/113736174
今日推荐