数组的解构赋值

 /* 1、变量的解构赋值:        * 数组的元素是按次序排列的,变量的取值由它的位置决定;        * 从数组和对象中提取值,对变量进行赋值,这被称为解构;        * 属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值        * */        let [a, b, c] = [1, 2, 3];        let [x, [v], [y]] = [1, [2], []];//就算是赋了空值,方括号也不能少,否则报错        console.log("y:" + y);//结果是undefined即解构不成功        console.log("x:" + x);//1        let [m, [n], w] = [1, [2, 3], 4];        console.log(m);//1        console.log(n);//2 等号左右两边的模式不尽相同,但是也解构成功,称之为不完全解构        console.log(w);//4

        /*2、数组默认值问题*/        let [foo = true] = [];//判断位置是否有值,没有值或者为undefined,即可赋值成功        console.log(foo);//true

        let [foo1 = true] = [undefined];//判断位置是否有值,没有值或者为undefined,即可赋值成功        console.log(foo1);//true        /*以上两个例子可看出,只有数组成员严格等于undefined时默认值才生效,但是null不等于undefined*/

        let [foo2 = true] = [null];        console.log(foo2);//null

        let [foo4 = true] = [false];        console.log(foo4);//false

        let [x1 = 1, y1 = x1] = [];        console.log(x1, y1);//x1=1,y1=1

        let [x2 = 1, y2 = x2] = [2];        console.log(x2, y2);//x2=2,y2=2

        let [x3 = 1, y3 = x3] = [1, 2];        console.log(x3, y3);//x3=1,y3=2

        let [x4 = y4, y4 = 1] = [];        console.log(x4, y4);//x4=undefined,y4=1(x4用y4做默认值时,y4还没有声明。解构失败)      },      clickObj: function () {/*3、变量的解构赋值:        * 对象的属性没有次序,变量必须与属性同名,才能取到正确的值。        * */        let {foo, bar} = {bar: 'a', foo: 'v'};//只要        console.log(foo);//v        console.log(bar);//a

        let {baz} = {foo: 'aaa', bar: 'bbb'};        console.log(baz);//undefined.解析的对象中没有对应的属性名,即解析失败

        const {log} = console;//将console.log赋值到log变量        log('hello') // hello

        let {foo1: ba} = {foo1: 'aaa', bar: 'bbb'};        console.log(ba);// "aaa"        //console.log(foo1) // error: foo1 is not defined        /*说明:foo1是匹配的模式,ba才是变量。真正被赋值的是变量ba,而不是模式foo1。*/

        /*模式与变量*/        let obj = {p: ['Hello',            {y: 'World'}          ]        };        //let { p: [x, { y }] } = obj;//p作为模式时本身不赋值        let {p, p: [x, {y}]} = obj;//p作为变量时也将参与赋值        console.log(x); // "Hello"        console.log(y); // "World"        console.log(p);//["Hello",{y: "World"}]  不完全解构,hello相当于逗号前面的p,x没有解构出来

        /*多重解构赋值*/        const node = {loc: {start: {line: 1,              column: 5            }          }        };        let {loc, loc: {start}, loc: {start: {line}}, loc: {start: {column}}} = node;        /*说明:一个逗号表示本次赋值结束,loc即该输出start包含start开始的内全部内容;        *  loc: { start }:表示loc为模式,start为变量,输出的就是start中 line和column的值        *  loc: { start: { line }}:表示loc和start都是模式不是变量,不会赋值,输出line的值        *  loc: { start: { column }}:道理同上        * */        console.log(line); // 1        console.log(loc);  // Object {start: Object} 即:{start:{line: 1, column: 5}}        console.log(start);// Object {line: 1, column: 5} 即:{line: 1, column: 5}        console.log(column);// 5

        /*对象默认值(对比以下三个例子)*/        var {message: msg = 'Something went wrong'} = {message: 12};        console.log(msg);//Something went wrong        //console.log(message);//error: message is not undefined

        var {v2: v1 = 15} = {v1: 10};        //console.log(v2);//error: v2 is not undefined        console.log(v1);//15

        var {w2: w1 = 15} = {};        //console.log(w2);//error: v2 is not undefined        console.log(w1);//15

        /*语法注意点:*/        let b;        //{b} = {b: 1};//报错,大括号开头的话变量 b 将被解析为大代码块        ({b} = {b: 1});//正确,小括号开头就行

        /*数组中对象属性的解构*/        let arr = [6, 66, 666];        let {0: first, [arr.length - 1]: last} = arr;//此处是把数组中数据的下标赋值给 first 和 last        console.log(first);// 6 下标为,0        console.log(last);// 666 解释:arr.length=3,3-1=2,下标为2      },      clickStr: function () {const [a, b, c, d, e] = 'hello';        /*        a // "h"        b // "e"        c // "l"        d // "l"        e // "o"        */        let {length: len} = 'hello';        /*        len // 5        */      },      clickBool: function () {/*数值或布尔类型解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。undefined 和 null 除外*/        let {toString: str} = 123;        str === Number.prototype.toString;

        let {toString: str1} = true;        str1 === Boolean.prototype.toString // true      },      clickParame: function () {function move({m1 = 0, m2 = 0} = {}) {//m1,m2在此为变量,且指定默认值,若是解构失败,也可得到默认值          return [m1, m2];        }

        console.log(move({m1: 10}));//10,0        console.log(move({m1: 10, m2: 20}));//10,20        console.log(move());//0,0        console.log(move({}));//0,0

        function move1({n1, n2} = {n1: 0, n2: 0}) {//m1,m2在此为参数,且指定默认值,若是解构失败,则结果不一样          return [n1, n2];        }

        console.log(move1({n1: 10}));//10,undefined        console.log(move1({n1: 10, n2: 20}));//10,20        console.log(move1());//0,0        console.log(move1({}));//undefined,undefined

        [1, undefined, 3].map((p = 'yes') => p);//若是传参数传递的undefined则可取到默认值        // 1,yes,3

      },      attention:function () {//let [(a)] = [1];        //let {x: (c)} = {};        //let ({x: c}) = {};        //let {(x: c)} = {};        //let {(x): c} = {};        //let { o: ({ p: p }) } = { o: { p: 2 } };        /*以上六个语句都报错,都是变量声明语句,模式不能使用圆括号*/

        //function f([(z)]) { return z; }        //function f([z,(x)]) { return x; }        /*以上两个语句属于函数参数变量声明,不能带圆括号*/

        //({ p: a }) = { p: 42 };        //([a]) = [5];        /*整个模式都放在圆括号更加错得离谱*/        //[({ p: a }), { x: c }] = [{p:2}, {c:5}];//模式部分也不能有部分圆括号包裹        //console.log(a)//a id not undefined

        /*正确使用圆括号的情况*/        [(b)] = [3]; // 正确,模式是数组的第一个成员,与模式无关        ({ p: (d) } = {}); // 正确,p属于模式        [(parseInt.prop)] = [3]; // 正确,与圆括号,没有模式之说      },      doing:function () {/*1、交换变量的值*/        let x = 1;        let y = 2;        [x, y] = [y, x];//交换变量的值

        /*2、从函数返回多个值或对象*/        // 返回一个数组        function example() {return [1, 2, 3];        }let [u, i, o] = example();        console.log(u);        console.log(i);        console.log(o);        // 返回一个对象        function example() {return {fo: 1,            br: 2          };        }let { fo, br } = example();

    /*3、将函数的参数和值一一对应起来*/        // 参数是一组有次序的值        function f([x, y, z]) { }f([1, 2, 3]);

     //参数是一组无次序的值        function f({x, y, z}) { }f({z: 3, y: 2, x: 1});

      /*4、提取json数据*/        let jsonData = {id: 42,          status: "OK",          data: [200, 401]        };

        let { id, status, data: number } = jsonData;        console.log(id, status, number);// 42, "OK", [200, 401]

      /*5、指定参数的默认值,就避免了在函数体内部再写var foo = config.foo || 'default foo';这样的语句。*/        jQuery.ajax = function (url, {async = true,          beforeSend = function () {},          cache = true,          complete = function () {},          crossDomain = false,          global = true,          // ... more config        } = {}) {// ... do stuff        };

/*6、遍历map结构*/        const map = new Map();        map.set('first', 'hello');        map.set('second', 'world');

        /*Map 结构原生支持 Iterator 接口*/        for (let [key, value] of map) {//获取键值对,包括添加进来的str          console.log(key + " is " + value);//first is hello  second is world        }

// 获取键名        for (let [key] of map) {// ...        }

// 获取键值        for (let [,value] of map) {// ...        }

/*7、输入模块的指定方法*/        const { SourceMapConsumer, SourceNode } = require("source-map");      }    }

对象的解构赋值

/*3、变量的解构赋值:* 对象的属性没有次序,变量必须与属性同名,才能取到正确的值。* */let {foo, bar} = {bar: 'a', foo: 'v'};//只要console.log(foo);//vconsole.log(bar);//a

let {baz} = {foo: 'aaa', bar: 'bbb'};console.log(baz);//undefined.解析的对象中没有对应的属性名,即解析失败

const {log} = console;//将console.log赋值到log变量log('hello') // hello

let {foo1: ba} = {foo1: 'aaa', bar: 'bbb'};console.log(ba);// "aaa"//console.log(foo1) // error: foo1 is not defined/*说明:foo1是匹配的模式,ba才是变量。真正被赋值的是变量ba,而不是模式foo1。*/

/*模式与变量*/let obj = {p: ['Hello',    {y: 'World'}  ]};//let { p: [x, { y }] } = obj;//p作为模式时本身不赋值let {p, p: [x, {y}]} = obj;//p作为变量时也将参与赋值console.log(x); // "Hello"console.log(y); // "World"console.log(p);//["Hello",{y: "World"}]  不完全解构,hello相当于逗号前面的p,x没有解构出来

/*多重解构赋值*/const node = {loc: {start: {line: 1,      column: 5    }  }};let {loc, loc: {start}, loc: {start: {line}}, loc: {start: {column}}} = node;/*说明:一个逗号表示本次赋值结束,loc即该输出start包含start开始的内全部内容;*  loc: { start }:表示loc为模式,start为变量,输出的就是start中 line和column的值*  loc: { start: { line }}:表示loc和start都是模式不是变量,不会赋值,输出line的值*  loc: { start: { column }}:道理同上* */console.log(line); // 1console.log(loc);  // Object {start: Object} 即:{start:{line: 1, column: 5}}console.log(start);// Object {line: 1, column: 5} 即:{line: 1, column: 5}console.log(column);// 5

/*对象默认值(对比以下三个例子)*/var {message: msg = 'Something went wrong'} = {message: 12};console.log(msg);//Something went wrong//console.log(message);//error: message is not undefined

var {v2: v1 = 15} = {v1: 10};//console.log(v2);//error: v2 is not undefinedconsole.log(v1);//15

var {w2: w1 = 15} = {};//console.log(w2);//error: v2 is not undefinedconsole.log(w1);//15

/*语法注意点:*/let b;//{b} = {b: 1};//报错,大括号开头的话变量 b 将被解析为大代码块({b} = {b: 1});//正确,小括号开头就行

/*数组中对象属性的解构*/let arr = [6, 66, 666];let {0: first, [arr.length - 1]: last} = arr;//此处是把数组中数据的下标赋值给 first 和 lastconsole.log(first);// 6 下标为,0console.log(last);// 666 解释:arr.length=3,3-1=2,下标为2

字符串的解构赋值

/*a // "h"b // "e"c // "l"d // "l"e // "o"*/let {length: len} = 'hello';/*len // 5*/

布尔数值类型的解构赋值

/*数值或布尔类型解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。undefined 和 null 除外*/let {toString: str} = 123;str === Number.prototype.toString;

let {toString: str1} = true;str1 === Boolean.prototype.toString // true

参数的解构赋值

function move({m1 = 0, m2 = 0} = {}) {//m1,m2在此为变量,且指定默认值,若是解构失败,也可得到默认值  return [m1, m2];}

console.log(move({m1: 10}));//10,0console.log(move({m1: 10, m2: 20}));//10,20console.log(move());//0,0console.log(move({}));//0,0

function move1({n1, n2} = {n1: 0, n2: 0}) {//m1,m2在此为参数,且指定默认值,若是解构失败,则结果不一样  return [n1, n2];}

console.log(move1({n1: 10}));//10,undefinedconsole.log(move1({n1: 10, n2: 20}));//10,20console.log(move1());//0,0console.log(move1({}));//undefined,undefined

[1, undefined, 3].map((p = 'yes') => p);//若是传参数传递的undefined则可取到默认值// 1,yes,3

写法格式注意点

//let [(a)] = [1];//let {x: (c)} = {};//let ({x: c}) = {};//let {(x: c)} = {};//let {(x): c} = {};//let { o: ({ p: p }) } = { o: { p: 2 } };/*以上六个语句都报错,都是变量声明语句,模式不能使用圆括号*/

//function f([(z)]) { return z; }//function f([z,(x)]) { return x; }/*以上两个语句属于函数参数变量声明,不能带圆括号*/

//({ p: a }) = { p: 42 };//([a]) = [5];/*整个模式都放在圆括号更加错得离谱*///[({ p: a }), { x: c }] = [{p:2}, {c:5}];//模式部分也不能有部分圆括号包裹//console.log(a)//a id not undefined

/*正确使用圆括号的情况*/[(b)] = [3]; // 正确,模式是数组的第一个成员,与模式无关({ p: (d) } = {}); // 正确,p属于模式[(parseInt.prop)] = [3]; // 正确,与圆括号,没有模式之说

用途:

pasting

/*1、交换变量的值*/        let x = 1;        let y = 2;        [x, y] = [y, x];//交换变量的值

        /*2、从函数返回多个值或对象*/        // 返回一个数组        function example() {return [1, 2, 3];        }let [u, i, o] = example();        console.log(u);        console.log(i);        console.log(o);        // 返回一个对象        function example() {return {fo: 1,            br: 2          };        }let { fo, br } = example();

    /*3、将函数的参数和值一一对应起来*/        // 参数是一组有次序的值        function f([x, y, z]) { }f([1, 2, 3]);

     //参数是一组无次序的值        function f({x, y, z}) { }f({z: 3, y: 2, x: 1});

      /*4、提取json数据*/        let jsonData = {id: 42,          status: "OK",          data: [200, 401]        };

        let { id, status, data: number } = jsonData;        console.log(id, status, number);// 42, "OK", [200, 401]

      /*5、指定参数的默认值,就避免了在函数体内部再写var foo = config.foo || 'default foo';这样的语句。*/        jQuery.ajax = function (url, {async = true,          beforeSend = function () {},          cache = true,          complete = function () {},          crossDomain = false,          global = true,          // ... more config        } = {}) {// ... do stuff        };

/*6、遍历map结构*/        const map = new Map();        map.set('first', 'hello');        map.set('second', 'world');

        /*Map 结构原生支持 Iterator 接口*/        for (let [key, value] of map) {//获取键值对,包括添加进来的str          console.log(key + " is " + value);//first is hello  second is world        }

// 获取键名        for (let [key] of map) {// ...        }

// 获取键值        for (let [,value] of map) {// ...        }

/*7、输入模块的指定方法*/        const { SourceMapConsumer, SourceNode } = require("source-map");

转载于:https://www.cnblogs.com/LindaBlog/p/10875913.html

es6—变量的解构赋值相关推荐

  1. ES6变量的解构赋值--对象篇

    目录 使用方式 普通形式 嵌套结构 使用默认值 注意事项 上一篇我们讲解了数组的解构赋值,解构还可以用于对象.字符串等等,这里我们来讲解对象的解构赋值. ES6变量的解构赋值--数组_zxn20012 ...

  2. (34)2021-02-24(ES6变量的解构赋值)

    ES6变量的解构赋值 一. 变量的解构赋值 1.什么是解构 2.数组解构赋值 不完全解构 3.对象解构赋值 方法解构 注意点 4.字符串解构 5.函数参数的解构赋值 6.用途 6.1 交换变量的值 6 ...

  3. ES6——变量的解构赋值

    ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构. let [a, b] = [1, 2]; let {c, d} = {c: 3, d: 4};console.log(a ...

  4. es6变量的解构赋值

    https://note.youdao.com/web/#/file/WEB0795aa69a66933c323f06127c9127f4d/note/WEBb0bbf2a9471ea54f2cb0f ...

  5. 【ES6】变量的解构赋值

    [ES6]变量的解构赋值 一.什么叫解构赋值? 二.解构赋值有哪些分类?写法? 1)对数组的解构赋值 2)对对象的解构赋值 3)对字符串的解构赋值 4)对数值和布尔值的解构赋值 5)对函数参数的解构赋 ...

  6. ES6的新特性(3)——变量的解构赋值

    变量的解构赋值 数组的解构赋值 基本用法 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). let a = 1; let b = 2; le ...

  7. Vue2.x—理解vuex核心概念action(使用到ES6的变量的解构赋值)

    Action Action 类似于 mutation,不同在于: Action 提交的是 mutation,而不是直接变更状态. Action 可以包含任意异步操作. 让我们来注册一个简单的 acti ...

  8. es6分享——变量的解构赋值

    变量的解构赋值:ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前的写法: var a = 1; var b = 2; es6允许的写法 ...

  9. [ES6] 细化ES6之 -- 变量的解构赋值

    变量的解构赋值 解构赋值是什么 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值 var/let [变量名称1,变量名称2,...] = 数组或对象 本质上,这种写法属于"模式 ...

最新文章

  1. 元宇宙:基础-虚拟现实栈开发和虚拟土地
  2. PHP如何进行错误与异常处理(PHP7中的异常处理和之前版本异常处理的区别)
  3. 矩阵推导后注意力机制居然是这样
  4. [bzoj3489]A simple rmq problem
  5. linux内核杂记(9)-进程调度(4)
  6. CSDN中的如何转载博文
  7. centos安装kvm
  8. Maven打包排除某个资源或者目录
  9. java 链表 最小堆优先级队列_Java集合细说
  10. delphi idtcpclient和idtcpserver的心跳包
  11. JDK1.8聚合操作
  12. php round函数
  13. 医院管理系统/医院药品管理系统
  14. python大漠库_python类似大漠插件的库
  15. Latex命令、符号、公式、数学符号编辑
  16. python获取12306火车票_Python接口获取12306火车票信息
  17. 程序员面试必备的八大数据结构
  18. 打印机与计算机接口大多数,打印机接口-西北师范大学.PPT
  19. 解决selenium实例化时警告问题
  20. matlab中牛顿下山法实例,非线性方程的数值解法牛顿下山法matlab

热门文章

  1. (九)把一切放在一起:用深度伪造换脸
  2. 在Android上可视化TensorFlow Lite AI结果
  3. 实现机器学习的循序渐进指南IV——逻辑回归
  4. 在存储过程中构建动态SQL
  5. ffmpeg 安装_CentOS7.6安装SRS和ffmpeg实现自建直播服务器
  6. pap认证过程_PPP协议当中LCP协商过程详解和PAP认证原理介绍
  7. css 入场动画_React系列十四 React过渡动画
  8. 大蛋陪伴机器人_家长孩子都喜欢 阿尔法蛋大蛋2.0 AI学习机器人图赏
  9. freemarker处理EL表达式
  10. linux找回删除的文件6,在Centos6/RHEL6上恢复ext4文件系统下误删除的文件