解构赋值

从数组中提取值,按照对应位置,对变量赋值

只要等号右边的值不是对象或数组,就先将其转为对象。

由于 undefined 和 null 无法转为对象,所以对它们进行解构赋值,都会报错

let [a, b, c] = [1, 2, 3];

只要某种数据结构具有 Iterator 接口,都可以采用数组形式的解构赋值

应用:

  • const person = {
    name: 'RyenToretto',
    age: 22,
    sex: '男'
    }; // 解构赋值
    const {name, age, sex} = person; // 缺点: 必须同名属性 console.log(name. age, sex); // 对比之前,明显好用了很多
    console.log(person.name, person.age, person.sex);
  • const arr = [1, 3, 5, 7, 9];
    
    const [a, b, c, d, e, f=-1] = arr;    // 是一组有序的赋值, 允许默认赋值 此时 f=-1,因为索引值为 undefined
    const [aa, , cc] = arr; // aa=1, cc=5
  • 如果解构不成功,变量的值就等于undefined。
  • 以下会报错
  • //右边的值  转为对象以后不具备 Iterator 接口
    let [foo] = 1;
    let [foo] = false;
    let [foo] = NaN;
    let [foo] = undefined;
    let [foo] = null; let [foo] = {}; // {} 本身就不具备 Iterator 接口
  • 解构赋值允许指定默认值
  • let [foo = true] = [];
    foo // true let [x, y = 'b'] = ['a']; // x='a', y='b'
    let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'

注意,ES6 内部使用严格相等运算符(===),判断一个位置是否有值

所以,只有当一个数组成员严格等于undefined,默认值才会生效。

  • let [x = 1] = [undefined];
    x // let [x = 1] = [null];
    x // null

如果默认值是一个表达式,那么这个表达式是惰性求值的,即只有在用到的时候,才会求值

  • function f() {
    console.log('aaa');
    } let [x = f()] = [1]; // 由于 x 可以取 1 ,所以函数 f() 不会被执行
  • 默认值可以引用解构赋值的其他变量,但该变量必须已经声明
  • let [x = 1, y = x] = [];      // x=1; y=1
    let [x = 1, y = x] = [2]; // x=2; y=2
    let [x = 1, y = x] = [1, 2]; // x=1; y=2
    let [x = y, y = 1] = []; // Reference Error: y is not defined
  • 对象的解构赋值
  • let { foo, bar } = { foo: "aaa", bar: "bbb" };
    foo // "aaa"
    bar // "bbb"

    实际上的完整写法: let { foo: foo, bar: bar } = { foo: "aaa", bar: "bbb" };

  • 也可以指定 默认值,生效的条件是,对象的属性值严格等于 undefined
  • var {x = 1, y = 2} = {x: 1}
    console.log(x); //
    console.log(y); //
  • 很有用的,sin(90*Math.PI/180);
  • let { log, sin, cos } = Math;
    console.dir(Math);
    console.dir(sin); // let {sin} = {sin:function(){}, cos:function(){}}
  • 由于数组本质是特殊的对象,因此可以对数组进行对象属性的解构
  • let arr = [1, 2, 3];
    let {0 : first, [arr.length - 1] : last} = arr;
    console.log(first); //
    console.log(last); //
  • 字符串的解构赋值

此时,字符串被转换成了一个类似数组的对象

  • const [a, b, c, d, e] = 'hello';
    console.log(a); // "h"
    console.log(b); // "e"
    console.log(c); // "l"
    console.log(d); // "l"
    console.log(e); // "o"
  • 类似数组的对象都有一个 length 属性,因此还可以对这个属性解构赋值 0
  • let {length : len} = 'hello';
    console.log(len); //
  • 等号右边是数值布尔值,则会先转为对象
  • let {toString: s} = 123;
    console.log(s === Number.prototype.toString); // true let {toString: s} = true;
    console.log(s === Boolean.prototype.toString); // true
  • 函数的 实参 与 形参 也可以进行 解构赋值
  • function add([x, y]){
    return x + y;
    } add([1, 2]); //
  • 函数 参数默认值    对象传参        参数是一组无序的值
  • function add({name = "someone", age = -1} = {name:"kjf", age:"22"}) {
    return [name, age];
    } console.log(add({name:"Jack", age:"31"})); // ["Jack", "31"]
    console.log(add({name:"Rose", age:"21"})); // ["Rose", "21"]
    console.log(add({})); // ["someone", -1]
    console.log(add()); // ["kjf", "22"]
  • 函数 参数默认值    数组传参        参数是一组有序的值
  • function person([name="someone", age=-1] = ["kjf", 22]) {
    return name + " : " +age;
    } console.log(person(["Jack", 30])); // 'Jack : 30'
    console.log(person(["Rose"])); // 'Rose : -1'
    console.log(person([])); // 'someone : -1'
    console.log(person()); // 'kjf : 22'

应用:

  • 交换变量的值
  • let x = 1;
    let y = 2; [x, y] = [y, x];
  • 快速提取 JSON 数据
  • let jsonData = {
    " id": 42,
    "status": "OK",
    "data": [867, 5309]
    }; let { id, status, data: number } = jsonData; console.log(id, status, number); // 42, "OK", [867, 5309]
  • for(let [attr1, attr2] of map){}

如此遍历   for(let [key, value] of map){}

任何部署了 Iterator 接口的对象,都可以用 for...of 循环遍历

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

ECMA Script 6_解构赋值_模式匹配的更多相关文章

  1. ECMA Script 6_数组的扩展_扩展运算符

    1. 扩展运算符 内部调用的是数据结构的 Iterator 接口, 因此只要具有 Iterator 接口的对象,都可以使用扩展运算符 ... 如 map,,,, [...arr] 扩展运算符(spre ...

  2. 简单的axios请求返回数据解构赋值

    本地  data.json 文件 { "name": "大熊", "age": 18, "fnc": [ 1, 2, 3 ...

  3. ECMA Script 6新特性之解构赋值

    1.基本概念用法 1.1解构赋值:ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值. var a = 1; var b = 2; var c = 3; /*上述赋值语句用解构赋值为*/ v ...

  4. ES6_入门(4)_数组的解构赋值

    //2017/7/14 //变量的解构赋值(解构:Destructuring) //(1)数组的解构赋值 let [a,b,c]=[1,2,3];//模式匹配,只要等号两边的模式相同,左边的变量就会被 ...

  5. ES6_入门(5)_解构赋值

    学习参考:http://es6.ruanyifeng.com/#docs/destructuring //2017/7/20 /*对象的解构赋值*/ //对象的解构赋值,当变量名的对象的属性名相同时, ...

  6. ES6新特性:利用解构赋值 (destructuring assignment), 简化代码

    本文的Demo的运行环境为nodeJS, 参考:让nodeJS支持ES6的词法----babel的安装和使用 : 解构赋值是一种表达式, 利用这种新语法, 可以直接从数组或者对象中快速提取值 赋值给不 ...

  7. ES6的变量解构赋值

      前  言 ES6 解构赋值: ES6允许按照一定模式从数组和对象中提取值,然后对变量进行赋值,这被称为解构. 1.1 数组的结构赋值 1.1.1基本用法 JS中,为变量赋值直接指定.例如下面代码: ...

  8. ECMAScript 6 -- 数组的解构赋值

    模式匹配:只要等号两边的模式相同,左边的变量就会被赋予对应的值. let [a, b, c] = [1, 2, 3]; 嵌套数组进行解构: let [foo, [[bar], baz]] = [1, ...

  9. ES6学习随笔--字符串模板、解构赋值、对象、循环、函数、Promise、Generrator

    在线编译器:babel.github 在nongjs中使用 'use strict' let a = ; 运行node : node --harmony_destructuring xxx.js 代码 ...

随机推荐

  1. 快速定位XPATH

    本文主要介绍如何快速定位WEB端的xpath. 浏览器:Chrome.火狐浏览器 两种浏览器的定位方法都是一样:按F12键,可查看开发者工具 上图,开发者工具最左上角是定位按钮,点击此按钮,再点击浏览 ...

  2. .NET面试题系列(十七)前端面试

    JavaScript  js如何实现继承 CSS 行内元素和块状元素的区别   CSS让2个DIV在同一行显示的解决方法 在CSS中,div属于块级元素,每个块级元素默认占一行高度,一行内添加一个块级 ...

  3. metasploit 教程之信息收集

    信息收集 信息收集范围很大,可以从不同层面,不同维度进行信息收集. 系统补丁 我们知道目标机器缺少什么补丁就意味着存在与其对应的漏洞.我们可以利用这些漏洞来达到我们渗透攻击的目的. # 使用的模块 u ...

  4. tp学习笔记1

    1.在tp中,model实际表示的只是一条记录,所以是个一维数组.所有记录组成的记录集,是用collection对象表示的. 2.model有一个静态方法get,使用:model::get(),返回的 ...

  5. 获取reporting services导出pdf的url的方法

    public static string genRptUrl(string strRptServer, string strRptPath, string strRptName, ParameterV ...

  6. Accoridion折叠面板

    详细操作见代码: <!doctype html> <html> <head> <meta charset="UTF-8"> < ...

  7. word20161228

    1.principles英[p'rɪnsəplz]美[p'rɪnsəplz]n.原则; 原理; 准则; 道义; 节操; 原则( principle的名词复数 ); 工作原理; [P-] (基督教科学派 ...

  8. 20175204 张湲祯 2018-2019-2《Java程序设计》 第一周学习总结

    20175204 张湲祯 2018-2019-2<Java程序设计>第一周学习总结 教材学习内容总结 -第一章Java入门要点: -Java的地位:具有面向对象,与平台无关,安全稳定和多线 ...

  9. 「luogu3313」[SDOI2014] 旅行

    题目大意 :有 n 个城市连成一棵树, 每个城市有两个关键字, 一个是该城市的宗教, 另一个是城市的评级;旅行者要在城市间旅行, 他只会在和自己宗教相同的城市留宿;维护四个树上操作 { 1. “CC ...

  10. Saltstack自动化操作记录(2)-配置使用

    之前梳理了Saltstack自动化操作记录(1)-环境部署,下面说说saltstack配置及模块使用: 为了试验效果,再追加一台被控制端minion机器192.168.1.118需要在master控制 ...