ES6-变量的解构赋值复习+学习
ES6------变量的解构赋值
由于之前学过ES6的解构赋值,但是只是略看了一点网上的视频,所以今天就看了看ES6对这一部分的详细介绍,然后做一个总结的笔记。
首先,先大概说一下什么是变量的解构赋值,大概了解一下是什么?然后从几个方面分别对这个概念,以及相应的知识做一个总结和学习,最后总结一下具体的用途,然后再看一下涉及到的不足,以及解决方法!具体分为以下几点:
1.基本用法(模式匹配),同时借此理解什么是变量赋值
2.对象的解构赋值
3.字符串的解构赋值
4.数值和布尔值的解构赋值
5.函数参数的解构赋值
6.重要的用途都有哪些
7.涉及到的括号问题
接下来就从上面这七点展开复习和学习!
1.基本用法(模式匹配),同时借此理解什么是变量赋值
1 //1.首先,什么是解构赋值?
2 //在ES6中,允许按照一定的模式从数组和对象中提取值,然后对变量进行赋值,这个被称为解构赋值,举个例子:
3 let a = 1;
4 let b = 2; //普通的变量声明
5 let [a,b] = [1,2]; //利用解构赋值进行的变量声明(该方法为“模式匹配”)
6 //至此我想大家都应该知道解构赋值的大概意思了吧!
7 //利用模式匹配的方法对数组进行解构:
8 let [a,[b,c]] = [1,[2,3]]; //简单理解就是对应变量对应的值
9
10
11 //2.模式匹配的三种情况:解构成功,解构不成功,不完全解构,以及模式匹配的条件。如下:
12 //(1)解构成功就是对应都有值,这个就不再多说
13 //(2)解构不成功,则变量的值就是undefined,例如:
14 let [f] = [];
15 let [a,f] =[1]; //这两个都是解构不成功,对应的f就是undefined
16 //(3)不完全解构,意思应该是数值较多,变量少的情况。例如:
17 let [a,b,c] = [1,2,3,4]; //这里右边有四个数值,左边有三个变量,那就是从左向右对应赋值,解构可以成功,但是不完全。
18 //(4)模式匹配的条件:如果等号右边不是可遍历的解构,那么将会报错。例如:
19 let [f] = 2;
20 let [f] = false;
21 let f = NaN; //这几个都会报错,原因就是等号右边的值转为对象后不具备Iterator接口,或者就是本身就没有这个接口
22 let f = undefined;
23 //只要有Iterator接口,或者是Generator函数,也都可以进行解构赋值,例如:
24 function *fibs(){
25 let a = 0;
26 let b = 1;
27 while(true){
28 yield a;
29 [a,b] = [b,a+b];
30 }
31 }
32 let [a,b,c,d,e,f] = fibs(); //f = 5;
33 //当然Iterator,Generator是什么?大家可以先搜索一下了解一下,在之后我会就这部分单独进行学习和复习,以及做笔记。
34
35
36 //3.默认值
37 //(1)解构赋值可以做默认值,那么默认值是干什么的?是什么?看以下例子你就知道了:
38 let [f = 1] = []; //f的值是1
39 let [x = 1] = [undefined] // x的值是1
40 let [x = 1] = [null] //x的值是null,这种情况和上面的不同,为什么呢?
41 //大家看完上面的例子为什么最后一个是null?看第(2)点。
42 //(2)注意一个默认值规则:ES6内部的默认值是先进行===判断,然后再让默认值生效的。
43 let [x = 1] = [null] //当执行这一句,会先判断等号右边括号内是否是undefined,此时右边是null与undefined不一样,所以默认值不会生效,结果就是null
44 let [x = 1] = []; //等号右边是空,空也就是undefined,所以默认值可以生效,所以x=1成立
45 //(3)默认值的方式
46 //默认值可以是变量:
47 let [x =1,y = x]= []; // x=1;y=1;
48 let []x = 1,y=x] =[2]; //x = 2,y = 2; 先进行===比较,如果右边有值,先赋值,如果没了,取默认值
49 //默认值可以表达式,而表达式是惰性的,在用时才会执行:
50 function(){
51 console.log('aaa');
52 }
53 let [x = f()] = [1]; //在该代码中,等号右边数组里面有值,则x可以取到值,因此不需要默认值,那么f()这个表达式根本不会执行。
54
55 //注意:数组的模式是成员,而不是成员的值,两回事,在最后的圆括号内会提及
2.对象的解构赋值
1 //1.对象解构的规则(与数组解构的区别)
2 //(1)对象解构与数组解构不同,对象解构是匹配属性名的,而不看顺序:
3 let {b,f} = {f:"f",b:"b"}; //得到的结果b为b,f为f
4 //(2)对象解构是属性找不到匹配值会得到undefined
5 //(3)对象的匹配模式,不同变量名的解构赋值操作:
6 let{匹配已有属性名:真正想要改变值的属性名} = {匹配已有的属性名:对应的属性值};
7 let{f:f} = {f:"fff"}; //对象的匹配模式是等号左边的f属性的值是个f变量,这样匹配到的f属性的值才是fff
8 let{f:a} = {f:"fff"}; //对象中含有属性a,但是等号右边没有属性a,此时怎么对属性a赋值呢?利用f属性:对应属性就可以让a得到fff
9 let{foo:bar} = {foo:"barbarbar"} //结果就让bar得到了barbarbar字符串
10 //在上面的代码中,foo与f是匹配的模式,f,a,bar才是变量,才是真正被赋值的,而不是匹配模式
11 //(4)匹配模式的嵌套理解:
12 var demo = {
13 a:{
14 b:{
15 c=1
16 }
17 }
18 }
19 var {a,a:{b},a:{b:{c}}} = demo; //c:1,b为{c=1},a为{b:obj},该匹配等号左边的a相当于 a:a的形式
20
21
22 //2.对象解构的默认值
23 //对象解构也可以有默认值,默认值的条件仍旧是等号右边对象属性判断为undefined
24 var {x = 3} ={} //x = 3
25 var {x:y = 3}={} //匹配模式x为匹配名字,对应得还是y得值改变,此时等号右边为undefined,y取默认值
26 var {x:x = 3} = {x:null} //仍旧为null
27
28
29 //3.对象解构与数组解构
30 //因为数组得本质也是对象,因此可以让对象与数组相互使用:
31 let arr = [1,2,3];
32 let{0:a,1:b,2:c} = arr; //a=1,b=2,c=3 此时就很类似伪数组
33
3.字符串的解构赋值
1 //字符串也可以解构赋值,此时就转化为一个伪数组形式
2 const [a,b,c]="big"; //a为b,b为i,c为g
3 //伪数组(对象)也有一个length属性
4 let {length:len} = "hello"; //len = 5;
5 //创建一个伪数组对象类似于下列:
6 var ar={
7 0:'1',
8 1:'2',
9 length:2
10 }
4.数值和布尔值的解构赋值
1 //等号右边是数值或者布尔值,则会先转化为对象,而undefined,或者null无法转化为对象,因此肯定会报错:
2 let {toString:a} = 1;
3 let {toString:a} = true;
4 //a都可以取到一个Number,一个Boolean , 因为数值和布尔值对象里面都含有toString方法,含有就可以用
5.函数参数的解构赋值
1 //函数得参数可以解构赋值
2 function add([x,y]){
3 return x+y;
4 }
5 add([1,2]) //3,其中[1,2]与形参[x,y]就相当于一个解构赋值 [x,y]=[1,2];
6 //函数参数解构可以有默认值,下面介绍两种不同形式
7 function x({x=0,y=0}={}){
8 return [x,y];
9 }
10 x({x:1,y:2}); //[1,2] 第一种参数
11 x({}); //[0,0] 第二种参数
12 x(); //[0,0] 第三种参数
13 //以上为第一种情况,当参数种等号右边传进去得值为第一种得时候,判断对象为非undefined则执行赋值,当传入的是第二种参数时,判断对象为undefined,此时就会有默认值x = 0, y = 0;
14 function({x,y}={x:0,y:0}){
15 return [x,y];
16 }
17 x({x:3,y:8}); //[3,8]
18 x({}) //[undefined,undefined]; 当传入为undefined,
19 //综上所属,实际上时函数参数来得到默认值,而不是变量x,y。当有undefined时会触发默认值
6.重要的用途都有哪些
1 //1.交换变量的值
2 let x = 1;
3 let y = 2;
4 [x,y] = [y,x];
5 //2.从函数返回多值
6 function sss(){
7 return [1,2,3];
8 }
9 let [a,b,c] =sss(); //当然也可以返回一个对象,
10 //3.函数参数定义,这个就不多说了
11 //4.提取JSON数据
12 let jsonDate = {
13 id:1,
14 status:'OK',
15 data:[888,888]
16 }
17 let {id,status,number} = jsonData;
18 //5.函数参数的默认值
19 //6.遍历Map解构
20 //任何部署了Iterator接口的对象都可以用for...of循环遍历。Map解构原生支持Iterator接口,配和变量值取值就很方便
21 var map = new Map();
22 map.set('a','b');
23
24 for(let [key,value] of map){
25 console.log(key + "is" + value);
26 }
27 //该部分如果涉及到那些不了解的部分可以先自行查阅,后面我也会一一学习map与Iter接口。
28 //7.输入模块的指定方法
29 const{SourceMapConsumer,SourceNode} = require("source-map");
30 //以上基本都是有数组,值传递的点,这些点注意可以使用解构赋值,会更加的方便,在学习复习后面的知识的时候,都会穿插举例子,越学越明白
7.涉及到的括号问题
1 //这里就涉及到解构赋值的问题了,解构赋值虽然很方便,但是解析起来并不是很容易,对于具体的种类需要遇到等号的时候才可以得到答案,出现[],{}都可以理解,但是出现了()又怎么办呢?ES6的解释就是,那就别用()了,哈哈,有问题,就跳过问题,不就没问题了?我直呼好家伙!当然肯定尽量不使用()。
2 //1.不能使用()的情况
3 //(1)变量的声明
4 let [(a)] = [1]; //肯定报错
5 let {x:(c)} = {} //报错
6 let {(x):c} = {} //报错
7 let (o:({p:p}))={o:{p:2}}; //报错
8 //声明变量绝对不可以用()
9 //(2)函数的参数,也属于变量声明肯定不可以加(),这里就不举例子了,把上面的等号左边的变量或者对象直接放到函数小括号内就是了
10 //(3)赋值语句
11 ({p:a}) = {p:42}; //报错
12 ({p:(d)}) = [5]; //报错
13 [({p:a}),{x:c}] = [{},{}]; //报错
14 //把代码模式放到括号里,把一部分放到括号里都会导致报错
15
16 //2.可以使用的情况
17 //只有一种赋值语句非模式部分可以使用()
18 [(b)] = [3]; //第一种数组
19 ({p:(d)}) ={}) //非模式部分可以使用括号
20 //首先,可以使用的原因,都是赋值语句,不是声明语句,括号里都不属于模式的一部分,第一种数组的模式是b值对应的数组的第一个成员,而括号里的是数组第一个成员对应的值。
今天的学习,就到这里,大家可能看到有些东西在哪里见过,当然我也不是无敌的,我自己原创一个内容,我肯定也是学习别人的知识,然后自己做个笔记方便日后复习,同时记录一下今天的学习内容,一天一点进步,一大堆的文字,没有什么图片,不精彩啊。但是,知识的学习就是这样,你想搞懂这个情况,肯定要阅读大量的文字,这也是一个过程,当你真正的体会到理解到知识的时候,就也有一种成就感吧,小小的喜悦。当然,我一个字一个字写了这么多,总结了记下了这些笔记,虽然在别人眼里可能很简单,没必要,但是一步一步我也会涉及到深层知识,就想Vue一样,渐进式的由浅入深,加油吧少年,奥里给!!!
ES6-变量的解构赋值复习+学习的更多相关文章
- ES6 - 变量的解构赋值学习笔记
变量的解析赋值 数组的解析赋值 es6允许按照一定的模式,从数组和对象中提取值,对变量进行赋值,这就称为解构. var a = 1; var b = 2; var c = 3; //在es6中允许写成 ...
- es6变量的解构赋值学习笔记
1. 解构赋值的规则是,只要等号右边的值不是对象,就先将其转为对象.由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错. let { prop: x } = undefin ...
- ES6 变量的解构赋值
数组的解构赋值 var [a,b,c] = [1,2,3]; 左边是变量,右边是值,根据数据结构一一对应 只要等号两边的模式相同,左边的变量就会被赋予右边对应的值,必须模式相同 如果等号 ...
- ES6变量的解构赋值
变量的解构赋值 1.数组的解构赋值 2.对象的解构赋值 3.字符串的解构赋值 4.数值和布尔值的解构赋值 5.函数参数的解构赋值 6.圆括号问题 7.用途 1.数组的解构赋值 ES6 允许写成下面这样 ...
- es6—变量的解构赋值
数组的解构赋值 ]]]]]]] = []}} = {}} = {}})]: first]: last} = arr} = {}) {}))}))}) {}))}))].]]]])})] }}} = { ...
- ES6变量的解构赋值(一)数组的解构赋值
let[a,...arr]=[1,2,3,4];//a==>1 arr==>[2,3,4] let [x, y, ...z] = ['a'];//a==>'a' y==>und ...
- ES6变量的解构赋值(二)对象的解构赋值
前面我们知道,数组的结构赋值需要按顺序进行赋值, let [a,,c] = [,,] console.log(a); console.log(c);//3 let [a,b] = [1];consol ...
- ES6中的变量的解构赋值, 解放我们的双手,实现变量的批量赋值
ES6--变量的解构赋值 引言 正文 一.数组的解构赋值 解构失败 不完全解构 默认值 二.对象的解构赋值 三.字符串的解构赋值 结束语 引言 变量的解构赋值, 听起来很复杂, 简单点说可以理解成批量 ...
- ES6学习之变量的解构赋值
前言:什么是ES6?ECMAScript 6(简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了.其中相比较于ES5新增了诸多的特性,并且ES6可转换为ES5的语法.- ...
随机推荐
- 《如何进行接口mock测试》
前言: Mock通常是指:在测试一个对象时,我们构造一些假的对象来模拟与其交互.而这些Mock对象的行为是我们事先设定且符合预期.通过这些Mock对象来测试对象在正常逻辑,异常逻辑或压力情况下工作是否 ...
- 小米路由器4a千兆版刷openwrt
现在网上搜小米路由器4a千兆版刷机的都是刷的padavan的,很少能找到openwrt的刷机教程. 首先刷openwrt系统的时候要先刷入引导程序breed,网上有一篇帖子写的很详细(https:// ...
- Vue使用axios post方法发送json数据报415Unsupported Media Type
1.Vue使用axios post方法发送json数据 <template> <el-aside> <el-form ref="form" :mode ...
- 解决vue项目中遇到父组件的按钮或操作控制重新挂载子组件但是子组件却无效果的情况
在vue项目中终会遇到需要父组件的按钮或操作控制重新挂载子组件的需求,我在新项目中就遇到这种需求.真实场景是父组件的早,中,晚三个按钮(代表三个时间段)来控制子组件的table表格列的动态加载. 子组 ...
- mysql int(3)与int(10)的数值范围相同吗?
提问: mysql的字段,unsigned int(3), 和unsinged int(6), 能存储的数值范围是否相同.如果不同,分别是多大? 回答: 不同,int(3)最多显示3位无符号整体,in ...
- iOS Swift结构体与类的方法调度
前言 hello,小伙伴们:在忙碌中闲暇之余给大家聊聊swift的知识点,今天给大家带来的是swift中结构体与类的方法调度详细区别,希望对你有所帮助,好了废话不用多说,接下来步入主题! 1.普通方法 ...
- C11 (GNU Dialect) -std=gnu11 和 -std=c11
C11 (GNU Dialect) -std=gnu11 和 -std=c11 C11 (GNU Dialect) -std=gnu11 和 -std=c11 用于 IntelliSense 的 C ...
- C语言中while 语句
while的执行顺序 while 循环的执行顺序非常简单,它的格式是: while (表达式) { 语句: } 概念:当表达式为真,则执行下面的语句:语句执行完之后再判断表达式是否为真,如果为真,再次 ...
- 编程题:X星人的金币
X星人的金币 时问限制:3000MS 内存限制:589824KB 题目描述: X是人在一艘海底沉船上发现了很多很多很多金币.可爱的X星人决定用这些金币来玩一个填格子的游戏.其规则如下:第1个格子放2枚 ...
- 新產品SWOT分析實例
推出新产品需要解决四个行销支柱: 价格 产品 促销 销售地点 要分析这些方面,请检查您的优势.劣势.机会和威胁,以帮助您在运行第一个广告或举行第一次促销之前将风险降至最低,并最大限度地利用资源.SWO ...