马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

ES6入门之变量的解构赋值(二)

[复制链接]
查看2032 | 回复0 | 2019-10-24 09:47:59 | 显示全部楼层 |阅读模式

前言

在上一章 ES6入门之let和const下令中我们对ES6的相干语法已经有了初步了解,上一章中我们主要学习了三大部门的内容,let下令的使用,块级作用域,const下令的使用,那么从本篇博客将进一步深入了解ES6中的相干语法,毕竟未来ES6是主流。

本章目的

  •  学会数组的解构赋值
  •  学会对象的解构赋值
  •  学会字符串的解构赋值
  •  学会数值和布尔值的解构赋值
  •  学会函数参数的解构赋值
  • 学会解构赋值的用途

本人对解构赋值的理解:模式匹配,匹配乐成获取值,匹配不乐成则为undefined,好比开心消消乐一样(我没有玩过,但是听过一点点),开心消消乐中只要有雷同的就会消散,然后加分,而模式匹配呢?匹配乐成加分,匹配不乐成则失败。

数组的解构赋值

数组的解构赋值非常简朴,只要等号左右两边模式匹配乐成,则获取值,否则为undefined,在解说数组解构赋值之前,我们先来看下我们从前界说变量的格式

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. let a=1;
  10. let b=2;
  11. let c=3;
  12. //大概
  13. let a=3,
  14. b=4,
  15. c=5;
  16. //ES6的模式
  17. let [a,b,c]=[4,5,6];//左右两边相称,a=4,b=5,c=6
  18. </script>
  19. </body>
  20. </html>
复制代码

在这里我们已经使用了数组的解构赋值,即let [a,b,c]=[4,5,6]左右两边举行模式匹配,可得a=4,b=5,c=6

(1)不完全解构

解构除了完全解构之外,还具备不完全解构的特性,即左边的模式只匹配一部门等号右边的数组

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. let [x,y]=[1,2,3];
  10. console.log(x);//1
  11. console.log(y);//2
  12. let [a,[b],d]=[1,[2,3],4];
  13. console.log(a);//1
  14. console.log(b);//2
  15. console.log(d);//4
  16. </script>
  17. </body>
  18. </html>
复制代码

(2)特殊值

如果等号右边不是数组,那么将会报错

  1. let [foo] = 1;
  2. let [foo] = false;
  3. let [foo] = NaN;
  4. let [foo] = undefined;
  5. let [foo] = null;<br />
复制代码

(3)默认值

数组的解构允许有默认值,如果一个数组的成员为null,默认值就不会生效,因为null不严格即是undefined

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. let [foo=true]=[];
  10. console.log(foo);//true
  11. let [x,y='b']=['a'];
  12. let [z,w='b']=['a',undefined];
  13. console.log(x);//a
  14. console.log(y);//b
  15. console.log(z);//a
  16. console.log(w);//b
  17. let [a=1]=[undefined];
  18. let [b=2]=[null];
  19. console.log(a);//1
  20. console.log(b);//null
  21. </script>
  22. </body>
  23. </html>
复制代码

对象的解构赋值

关于对象的解构赋值我总结了如下三点

  • 数组的元素是按次序分列的,变量的取值有它的位置决定,而对象的属性是没有次序的,变量必须和属性同名,才气取到精确的值
  • 如果解构失败,变量的值即是undefined
  • 对象解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量,真正被赋值的是后者,而不是前者

示例1

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>对象的解构赋值</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. //按次序分列
  10. // let {foo,bar}={foo:'foo',bar:'bar'};
  11. // console.log(foo);//foo
  12. // console.log(bar);;//bar
  13. //不按次序分列
  14. // let {bar,foo}={foo:'foo',bar:'bar'};
  15. // console.log(bar);//bar
  16. // console.log(foo);;//foo
  17. //解构不乐成,值为undefined
  18. let {baz}={foo:'foo',bar:'bar'};
  19. console.log(baz);//undefined
  20. </script>
  21. </body>
  22. </html>
复制代码

在这个案例中,我们有按次序的解构,没有次序的解构,以及解构不乐成的环境

示例二

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>对象的解构赋值</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. let {foo:baz}={foo:'aaa',bar:'bbb'}
  10. console.log(baz);//aaa
  11. let obj={first:'hello',last:'world'};
  12. let {first:a,last:b}=obj;
  13. console.log(a);//hello
  14. console.log(b);//world
  15. </script>
  16. </body>
  17. </html>
复制代码

从而可以看出:对象解构赋值的原理是先找到同名属性,然后再赋给对应变量,真正被赋值的是后者而不是前者

字符串的解构赋值

字符串的结构赋值非常简朴,和之前的解构赋值一样也是模式匹配,留意:字符串中有length属性

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>字符串解构赋值</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. const [a,b,c,d,e]='hello';
  10. console.log(a);;//h
  11. console.log(b);//e
  12. console.log(c);//l
  13. console.log(d);//l
  14. console.log(e);//o
  15. let {length:len}='hello';
  16. console.log(len);//5
  17. </script>
  18. </body>
  19. </html>
复制代码

数值和布尔值的解构赋值

解构赋值原理:只要等号右边的值不是数组或对象,就先将其转为对象,但是也有特殊环境,如:undefined和null无法转为对象,所以对它们举行解构赋值都会报错。这一点非常重要

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>数值和布尔值的解构赋值</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. // let {toString:s}=123;
  10. // console.log(s===Number.prototype.toString);
  11. // let {toString:b}=true;
  12. // console.log(b===Boolean.prototype.toString);
  13. let {prototype:x}=undefined;
  14. let {prop:y}=null;
  15. console.log(x);//报错
  16. console.log(y);//报错
  17. </script>
  18. </body>
  19. </html>
复制代码

函数参数的解构赋值

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>函数参数解构赋值</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. function add([x,y]){
  10. return x+y;
  11. }
  12. console.log(add([1,3]));//4
  13. [[1,2],[3,4]].map(([a,b])=>{
  14. console.log(a+b);//4,7
  15. })
  16. //使用默认值
  17. function move({x=0,y=0}){
  18. return [x,y]
  19. }
  20. move({x:3,y:10});//[3,8]
  21. move({x:3})//[3,0]
  22. move({})//[0,0]
  23. move();//[0,0]
  24. function bar({x,y}={x:0,y=0}){
  25. return [x,y]
  26. }
  27. move({x:3,y:8});//[3,8]
  28. move({x:3});//[3,undefined]
  29. move({});//[undefined,undefined]
  30. move();//[0,0]
  31. </script>
  32. </body>
  33. </html>
复制代码

在move方法中函数move的参数是一个对象,通过对这个对象举行解构,得到变量xy的值。如果解构失败,xy即是默认值,而函数bar的参数指定默认值,而不是为变量xy指定默认值,所以会得到与前一种写法不同的结果

解构赋值的现实用途

(1)交换变量的值

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>解构赋值的用途</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. //(1)交换变量的值
  10. let x=1;
  11. let y=2;
  12. [x,y]=[y,x];
  13. console.log(x);//2
  14. console.log(y);//1
  15. </script>
  16. </body>
  17. </html>
复制代码

在这里,我们可以看到x和y的值举行了交换,x的值从1变成的2,而y的值从2变成了1

(2)从函数返回多个值

我们知道javascript中中使用return只能返回一个值,如果需要返回多个值的话就需要将数据放在数组或对象中,然后return归去,但是有了解构赋值,你想要取出这些值就非常方便,我们看下下面的示例。

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>解构赋值的用途</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. //(2)从函数返回多个值
  10. //返回一个数组
  11. function bar(){
  12. return[1,2,3]
  13. }
  14. let[a,b,c]=bar();
  15. console.log(a);//1
  16. console.log(b);//2
  17. console.log(c);//3
  18. //返回一个对象
  19. function baz(){
  20. return{
  21. x:1,
  22. y:2,
  23. }
  24. }
  25. let {x,y}=baz();
  26. console.log(x);//1
  27. console.log(y);//2
  28. </script>
  29. </body>
  30. </html>
复制代码

在这里我们返回一个数组之后使用a,b,c举行解构赋值,匹配a=1,b=2,c=3,而返回对象之后我们使用对象来吸收,留意:返回对象的键名肯定要和需要解构的键名同等,否则取到的值为undefined

(3)函数参数界说

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>解构赋值的用途</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. //(3)函数参数界说
  10. //参数是一组有次序的值
  11. function foo([x,y,z]){
  12. console.log(x);//1
  13. console.log(y);//2
  14. console.log(z);//3
  15. }
  16. foo([1,2,3]);
  17. //参数是一组无序的值
  18. function bar({x,y,z}){
  19. console.log(x);//10
  20. console.log(y);//20
  21. console.log(z);//1
  22. }
  23. bar({z:1,x:10,y:20})
  24. </script>
  25. </body>
  26. </html>
复制代码

(4)提取JSON数据

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>解构赋值的用途</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. //(4)提取JSON数据
  10. let stu={
  11. name:'一只流浪的kk',
  12. age:18,
  13. sex:'male'
  14. }
  15. let {name:name,age:age,sex:sex}=stu;
  16. console.log(name,age,sex);//一只流浪的kk,18,male
  17. </script>
  18. </body>
  19. </html>
复制代码

使用解构赋值可以很方便的提取JSON中的数据

(5)函数参数默认值

这种方法我们见过很多,再封装ajax的时候经常用到大概是扩张jquery插件的时候,我们都会添加默认值

  1. //(5)函数参数默认值
  2. ;
  3. (function(method) {
  4. method(window, window.document, jQuery);
  5. }(function(win, doc, $) {
  6. $.fn.SuperPlus = function(options) {
  7. //默认参数
  8. var setting={
  9. length:3,
  10. color:"blue"
  11. };
  12. //使用用户的参数覆盖默认参数
  13. $.extend(setting,options);
  14. return $.each(this, function(index, obj) {
  15. $("").html("+").css("cursor", "pointer").css("color",setting.color).click(function() {
  16. $(obj).width($(obj).width() + setting.length);
  17. }).insertAfter(obj);
  18. });
  19. }
  20. }));
复制代码

在这里我们就是指定了默认值,我们对外开发我们可以让用户举行修改的一些参数,当用户没有通报的时候,我们就使用默认值

(6)遍历Map结构

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>解构赋值的用途</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. //(6)遍历Map结构
  10. const map=new Map();
  11. map.set('first','hello');
  12. map.set('last','world');
  13. for(let [key,value] of map){
  14. console.log('键是:'+key,'值是:'+value);//键:first,last,值:hello,world
  15. }
  16. //大概
  17. for(let [key,value] of map.entries()){
  18. console.log('键是:'+key,'值是:'+value);//键:first,last,值:hello,world
  19. }
  20. //如果只想遍历key
  21. for(let [key,] of map){
  22. console.log(key);//first,last
  23. }
  24. //如果只想遍历value
  25. for(let [,value] of map){
  26. console.log(value);//hello,world
  27. }
  28. </script>
  29. </body>
  30. </html>
复制代码

这里涉及到map的相干知识,关于ES6新增的数据结构,查看博客 https://www.cnblogs.com/jjgw/p/11561169.html

(7)输入模块的指定方法

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>解构赋值的用途</title>
  6. </head>
  7. <body>
  8. <script type="text/javascript">
  9. //(7)输入模块的指定方法
  10. const{add,sub}=require('count');
  11. </script>
  12. </body>
  13. </html>
复制代码

这种方法我们之后会用到,关于ES6中模块的加载,比方:AMD,CMD,UMD等等,现阶段只需要了解一下







来源:https://www.cnblogs.com/jjgw/p/11717379.html
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则