相较于常规的赋值方式,解构赋值最主要的是'解构'两个字,在赋值的过程中要清晰的知道等号右边的结构.

先简单地看一下原来的赋值方式.

 var a=[1,2]    

分析一下这句代码的几个点:

(1)变量申明和赋值

var a;
a=[1,2]
//你可以理解这两个操作是分开的,虽然是一句代码.声明变量都会出现变量名的提升(也就是是声明变量的这句代码会被提升到生效作用域的最前面),区别在于'var'声明的是全局变量,而'let const'声明的是块级作用域变量.

(2)结构对应

var a;
a=[1,2];
a=12;
a={name:'小明',age:18}

解构赋值

结合上面的的例子,假如我现在只想要{name:'小明',age:18}这个对象中的'name'属性,原来的做法

var a={name:'小明',age:18}
console.log(a.name)

就需要通过点语法去获取,实际开发中,我们的数据很多时候是嵌套很多层的,所以就会出现类似'a.b.c.d'这类代码.看着让人头晕,而解构赋值就是解决这个问题的方案之一

基本用法

(1)声明和赋值

    数组

let [a] = [1];

   [变量名]:变量名可随意

对象

let {name} = {name:'小明',age:18}

 {变量名}:变量名必须是对象中的属性名 

(2)结构对应(重难点) 

数组(要位不要名) 

对象(要名不要位)

完全解构 

数组:

          a:按顺序

let [a, b, c] = [1, 2, 3];
console.log(a,b,c)
//1,2,3
这样赋值的语义是我知道右边是一个有三个元素的数字,所以我声明了一个数组,三个元素分别是a,b,c和右边的三个元素对应.所以a=1,b=2,c=3 

   b:打乱顺序

let [a, c, b] = [1, 2, 3];
console.log(a,b,c)
//1,3,2
因为三个变量的位置变了,所以其对应的元素(值)也就变量  

 对象:

        a:按顺序

let {name,age} ={name:'小明',age:18}
console.log(name,age)
//小明,18

  b:打乱顺序  

let {age,name} ={name:'小明',age:18}
console.log(name,age)
//小明,18

 虽然变量的声明前后顺序变了,但是对象中的值没变,它最终还是根据属性名去找值,所以结果没变

   c:不存在的属性名

let {name,sex} ={name:'小明',age:18}
console.log(name,sex)
//小明,undefined

  

嵌套解构

数组:

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

  对象

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

  

 

不完全解构

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

  

 (3)重命名(先取再重命名)

数组:我们上面说过,数组解构的时候只要注意位置对应就行了,名称啥的无所谓,你喜欢叫什么变量名就什么变量名

对象:对象解构的时候是要属性名对应才能取到值.但是没有说取到值之后不能重命名啊.一定要取到值之后在命名  

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

 (4)默认值(先取再默认)

数组

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:'小明',age:18}
console.log(sex) //小明
let {name:{sex='男'}} = {name:'小明',age:18}
console.log(sex) //男 //这里刚好通过这两个例子区分一下重命名和嵌套

 (5)字符串解构

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

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

  

 (6)函数参数自动解构

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

  

  参数默认值陷阱单独再写一篇

(7)先声明再赋值(少用)

数组

let a;
let b;
[a,b]=[1,2]
console.log(a,b) //1,2

  

 对象

let x;
{x}={x:1,y:1} //报错 主要还是大括号的原因,js在行首遇到{}会把它当做代码块执行,所以会报错.
({x}={x:1,y:1}) //这样可以解决问题,但是尽量别引入(),问题会变得复杂

  

到这里为止,解构赋值的日常使用没问题了,它带来了不少方便,但也会产生一些新bug,比如:let {data} =res 的写法,假如res里面并没有data属性,那就会undefined,所以还是得明确等号右边的解构. 

 

 

 

  

  

ES6解构赋值的简单使用的更多相关文章

  1. ES6解构赋值

    前面的话 我们经常定义许多对象和数组,然后有组织地从中提取相关的信息片段.在ES6中添加了可以简化这种任务的新特性:解构.解构是一种打破数据结构,将其拆分为更小部分的过程.本文将详细介绍ES6解构赋值 ...

  2. es6解构赋值总结

    数组的解构赋值 1.简单的赋值方式 2.多维数组解构赋值 3.默认值,只有当右边对应位置为undefined时候才会选择默认(null不属于undefined) 4.左右不对等,会相应的对号入座,没有 ...

  3. 简单看看es6解构赋值

    哎,我真的是太难了,今天就被这个解构赋值(也可以叫做析构,貌似析构是在c++中的,所以我这里叫做解构赋值吧)弄的我很烦,本来以为很容易的,结果还是弄了好久...就总结一下解构吧! 1.解构的基本使用 ...

  4. ES6—解构赋值

    1.什么是解构赋值 ES6允许按照预定的模式,从数组.对象中提取值,对变量进行赋值. 我们直接用例子说明.    2. 数组的解构赋值 数组传统的变量赋值:      var arr=[1,2,3]; ...

  5. es6 解构赋值

    ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 关于给变量赋值,传统的变量赋值是这样的: var arr = [1,2,3];//把数组的值 ...

  6. (2)ES6解构赋值-数组篇

    1.解构赋值-数组篇 //Destrcturing(解构) //ES5 /* var a = 1; var b = 2; var c = 3; */ //ES6 var [a,b,c] = [1,2, ...

  7. es6 解构赋值 新认知/新习惯

    es6 的解构赋值其实很早就学习了,但一直纠结于习惯和可读性问题,所以没有大规模使用.最近被 react调教一番之后.已经完全融入认知和习惯中去了.总结一下三个常用的技巧: 对象取值 取值并重命名 剩 ...

  8. ES6解构赋值常见用法

    解构赋值出现的契机: let obj = { a: 1, b: 2 } // 取值 let a = obj.a let b = obj.b 问题核心: 每次取值既要确定对象属性名,还得重新定义一个变量 ...

  9. ES6 解构赋值详解

    解构赋值是对赋值运算符的扩展,可以将属性/值从对象/数组中取出,赋值给其他变量. 一.数组的解构赋值 1.基本用法 只要等号两边的模式相同,左边的变量就会被赋予对应的值. let [a, [[b], ...

随机推荐

  1. [bzoj2789]Letters

    考虑A中第i次出现的j字符,最终位置一定是在B中第i次出现的j字符的位置,然后即求逆序对数量,cdq/线段树即可 1 #include<bits/stdc++.h> 2 using nam ...

  2. 七、Hadoop3.3.1 HA 高可用集群QJM (基于Zookeeper,NameNode高可用+Yarn高可用)

    目录 前文 Hadoop3.3.1 HA 高可用集群的搭建 QJM 的 NameNode HA Hadoop HA模式搭建(高可用) 1.集群规划 2.Zookeeper集群搭建: 3.修改Hadoo ...

  3. ASP.NET 使用 Dispose 释放资源的四种方法

    Dispose 和 Finalize 是运行的 .NET 和 .NET Core 应用程序释放占用的资源的两种方法.通常,如果应用程序中有非托管资源,应该显式地释放这些资源占用的资源. 由于 Fina ...

  4. Redis | 第4章 Redis中的数据库《Redis设计与实现》

    目录 前言 1. Redis中的数据库 2. 数据库的键空间 3. 键的生成时间与过期时间 4. Redis中的过期键删除策略 5. AOF.RDB和复制功能对过期键的处理 5.1 生成 RDB 文件 ...

  5. 【Tool】IntelliJ 搭建Node.js环境

    IntelliJ IDEA 开发 Node.js 2019-07-29  14:12:34  by冲冲 1. 配置插件 在IDEA的 file -> setting -> Plugins, ...

  6. Java 操作符小记

    "在最底层,Java中的数据是通过使用操作符来操作的" (Thinking in Java) 1 算术操作符 Java 中的基本算术操作符和其他大多数程序设计语言是相同的.其中包括 ...

  7. C/C++转义字符表

    转义字符 意义 ASCII码值(十进制) \a 响铃(BEL) 007 \b 退格(BS) ,将当前位置移到前一列 008 \f 换页(FF),将当前位置移到下页开头 012 \n 换行(LF) ,将 ...

  8. Atcoder Grand Contest 030 F - Permutation and Minimum(DP)

    洛谷题面传送门 & Atcoder 题面传送门 12 天以前做的题了,到现在才补/yun 做了一晚上+一早上终于 AC 了,写篇题解纪念一下 首先考虑如果全是 \(-1\)​ 怎么处理.由于我 ...

  9. 自定义 Word 模板

    自定义 Word 模板 目录 必要设置 样式设置 标题样式 多级列表 封面 正文 引用目录 页码 页眉 图标 自定义模板保存 样式导入和导出 批量删除多余空白段落 必要设置 显示所有格式标记 选择&q ...

  10. MariaDB——数据库登录

    登录MariaDB数据库,用root账户和密码: 显示所有数据库列表:其中,information_schema.performance_schema.test.mysql,这4个库表是数据库系统自带 ...