一、数组的解构赋值

let [foo, [[bar], baz]] = [1, [[2], 3]];

  ①可多不可少,等号的右边是数组

let [x, y] = [1, 2, 3]; //可以
let [bar, foo] = [1]; //foo的值为undefined // 报错
let [foo] = 1;
let [foo] = false;
let [foo] = NaN;
let [foo] = undefined;
let [foo] = null;
let [foo] = {};
//(具备 Iterator 接口?)

 

  ②默认值

let [foo = true] = [];
foo // true

二、对象的解构赋值

  ①对象的属性没有次序,变量必须与属性同名,才能取到正确的值

let { foo, bar } = { foo: "aaa", bar: "bbb" };
foo // "aaa"
bar // "bbb"
//(全)
let { foo: foo, bar: bar } = { foo: "aaa", bar: "bbb" };

  ②对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量

//foo是匹配的模式,baz才是变量
let { foo: baz } = { foo: "aaa", bar: "bbb" };
baz // "aaa"
foo // error: foo is not defined

  ③对数组进行对象解构

let arr = [1, 2, 3];
let {0 : first, [arr.length - 1] : last} = arr;
first //
last //

三、字符串的解构赋值
  ①

const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
e // "o"

  ②

let {length : len} = 'hello';
len //

四、数值和布尔值的解构赋值

  ①解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。

//数值和布尔值的包装对象都有toString属性,因此变量s都能取到值
let {toString: s} = 123;
s === Number.prototype.toString // true let {toString: s} = true;
s === Boolean.prototype.toString // true

  

  ②undefined和null无法转为对象

五、函数参数的解构赋值

  ①传入参数时,数组参数被解构成变量x和y。

function add([x, y]){
  return x + y;
} add([1, 2]); //

  

  ②undefined会触发函数参数的默认值

[1, undefined, 3].map((x = 'yes') => x);
// [ 1, 'yes', 3 ]

六、圆括号问题(可能导致解构歧义)

  ①有好几条不能用的,我觉得还是尽量都不用吧。

  ②可以使用圆括号的情况只有一种:赋值语句的非模式部分,可以使用圆括号

七、用途

  ①交换变量的值

let x = 1;
let y = 2;
[x, y] = [y, x];

  ②从函数返回多个值

// 返回一个数组

function example() {
return [1, 2, 3];
}
let [a, b, c] = example(); // 返回一个对象 function example() {
return {
foo: 1,
bar: 2
};
}
let { foo, bar } = example();

  ③函数参数的定义

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

  ④提取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]

  ⑤函数参数的默认值(这样就避免了在函数体内部再写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
};

  ⑥遍历Map结构

var map = new Map();
map.set('first', 'hello');
map.set('second', 'world'); for (let [key, value] of map) {
console.log(key + " is " + value);
}
// first is hello
// second is world // 获取键名
for (let [key] of map) {
// ...
} // 获取键值(value前面还有逗号)
for (let [,value] of map) {
// ...
}

  ⑦输入模块的指定方法

const { SourceMapConsumer, SourceNode } = require("source-map");

ECMAScript 6 入门学习笔记(二)——变量的解构赋值的更多相关文章

  1. ES6学习笔记之变量的解构赋值

    变量的解构赋值 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构. 数组的解构赋值 以前,为变量赋值,只能直接指定值: 1 2 3 var a = 1; var b = 2; ...

  2. ES6学习 第二章 变量的解构赋值

    前言 该篇笔记是第二篇 变量的解构赋值. 这一章原文链接: 变量的解构赋值 解构赋值 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 解构 ...

  3. ES6学习笔记(2)----变量的解构和赋值

    参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ 变量的解构和赋值 本质上:只要模式匹配,左边的变量就能被赋予右边对应的值 原则: 解构赋值的规则 ...

  4. es6学习2:变量的解构赋值

    一:数组的解构赋值 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构 let [foo, [[bar], baz]] = [1, [[2], 3]]; foo bar ba ...

  5. ES6之主要知识点(二) 变量的解构赋值。默认值

    引自http://es6.ruanyifeng.com/#docs/destructuring 数组解构赋值 默认值 对象解构赋值 用途 1.数组的解构赋值 let [a, b, c] = [1, 2 ...

  6. ES6 学习笔记 - 变量的解构赋值

    变量的解构赋值 学习资料:ECMAScript 6 入门 数组的解构赋值 基本用法 可以从数组中提取值,按照对应位置,对变量赋值.这种写法属于"模式匹配". let [a, b, ...

  7. ES6 - 变量的解构赋值学习笔记

    变量的解析赋值 数组的解析赋值 es6允许按照一定的模式,从数组和对象中提取值,对变量进行赋值,这就称为解构. var a = 1; var b = 2; var c = 3; //在es6中允许写成 ...

  8. ECMAScript 6入门 - 变量的解构赋值

    定义 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 解构赋值不仅适用于var命令,也适用于let和const命令. 解构赋值的规则是,只要 ...

  9. ES6学习笔记(一)-变量的解构赋值

    变量的解构赋值种类 解构(Destructuring):ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值. 只有当一个数组成员严格等于(===)undefined,包括空“ ” ,默认值 ...

  10. es6变量的解构赋值学习笔记

    1. 解构赋值的规则是,只要等号右边的值不是对象,就先将其转为对象.由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错. let { prop: x } = undefin ...

随机推荐

  1. redis的持久化的原理介绍和实现

    redis提供了持久化功能——RDB和AOF.通俗的讲就是将内存中的数据写入硬盘中. RDB一定时间取存储文件,AOF默认每秒去存储历史命令,官方建议两种方式同时使用 一.RDB(Redis Data ...

  2. Notepad++安装插件

    https://sourceforge.net/projects/npp-plugins/files/ 下载完插件后,通过notepad++的设置>>>>导入>>& ...

  3. JavaScript--DOM删除节点removeChild()

    删除节点removeChild() removeChild() 方法从子节点列表中删除某个节点.如删除成功,此方法可返回被删除的节点,如失败,则返回 NULL. 语法: nodeObject.remo ...

  4. Linux文件详解

    一.Linux文件类型分:普通文件.目录文件.链接文件.设备文件.管道文件. 1.普通文件:由ls -al显示属性时,第一个属性为 [-],例如 [-rwxrwxrwx].包括: 纯文本文件(ASCI ...

  5. 区间DP UVA 11584 Partitioning by Palindromes

    题目传送门 /* 题意:给一个字符串,划分成尽量少的回文串 区间DP:状态转移方程:dp[i] = min (dp[i], dp[j-1] + 1); dp[i] 表示前i个字符划分的最少回文串, 如 ...

  6. Win7上安装Oracle数据库

    由于ORACLE并没有FOR WIN7的版本,必须下载for vista_w2k8这个版本,将oralce 10G的安装镜像解压到硬盘,然后修改安装目录下的rehost.xml和oraparam.in ...

  7. ch1 About thinking skills

    When confronted with a problem , we think about it. The issue, of course, is that our efforts may be ...

  8. 2105. [NOIP2015] 信息传递

    ★☆   输入文件:2015message.in   输出文件:2015message.out   简单对比 时间限制:1 s   内存限制:256 MB [题目描述] 有n个同学(编号为1到n)正在 ...

  9. 全志A33平台编译linux(分色排版)sina33

    全志A33平台编译linux 大文实验室/大文哥 壹捌陆捌零陆捌捌陆捌贰 21504965 AT qq.com 完成时间:2017/12/12 17:36 版本:V1.0 Xshell 5 (Buil ...

  10. 世界上最受欢迎的10个Linux发行版

    帮助新的Linux用户在越来越多的Linux发行版中选择最合适的操作系统,是创建这个网页的原因.它列出了迄今为止最流行的10个Linux发行版(另外增加的是FreeBSD,到目前为止最为流行的BSD系 ...