▓▓▓▓▓▓ 大致介绍

  解构:就是将声明的一组变量和与相同结构的数组或者对象的元素数值一一对应,并将变量相对应元素进行赋值

▓▓▓▓▓▓ 数组解构

  例子:

    let [a,b,c] = [1,2,3];
console.log(a); //
console.log([a,b,c]); //[1, 2, 3]

  可以看到,数组中的a,b,c分别对应1,2,3

  嵌套的数组也可以进行解构

    let [a,[b,[c]]] = [1,[2,[3]]];
console.log(c); // let [d,,e] = [1,2,3];
console.log(e); // let [f,...tail] = [1,2,3];
console.log(tail); //[2, 3]

  在解构不成功时,变量的值就是undefined

    let [a,b] = [1];
console.log(b); //undefined

  不完全解构也是可以的

    let [a,b,c] = [1,2,3,4];
console.log(c); //

  也可以设置默认值

    let [a = 1] = [];
console.log(a); // let [b = 1] = [2];
console.log(b); // let [c = 1] = [undefined];
console.log(c); // let [d = 1] = [null];
console.log(d); //null

  注意:在ES6中使用严格相等运算符(===)。所以如果默认值不严格相等undefined,默认值就不会生效。例如null

  默认值也可以是表达式,但是要注意只有默认值在使用时才会触发函数(惰性求值)

    function f(){
alert(1);
} let [a = f()] = [3]; //f()不会执行 let [b = f()] = [undefined]; //会执行

▓▓▓▓▓▓ 对象解构

  例子:

    let {foo,bar} = {foo:1,bar:2};
console.log(foo); //

  注意:与数组不同,对象解构时不是根据位置对变量赋值的,而是通过变量名进行赋值,即变量名和属性名必须相等才可以进行赋值,位置不重要

    let {bar,foo} = {foo:1,bar:2};
console.log(foo);//

  如果变量名和属性名不相同,则要采取下面的方法

    let {first: f,last: l} = {first:1,last:3};
console.log(l); //

  意思就是先在对象中查找first属性,如果有就赋值给f,其中first是匹配的模式,而f才是真正的变量

  所以对象解构的完整形式是:

    let {first: first,last: last} = {first:1,last:3};

  对象解构也可以进行嵌套

    let obj = {
a:1,
b:[
'hello',
{c:'world'}
]
} let {a: a,b: [h,{c:w}]} = obj; console.log(a); //
console.log(h); //hello
console.log(w); //world

  对象解构也可以设置默认值,并且如果解构失败,变量会赋值undefined

    let {x: x = 1,y: y=2,z: z=3,w: w} = {x:3,y:null,z:undefined};

    console.log(x) //
console.log(y) //null
console.log(z) //
console.log(w) //undefined

▓▓▓▓▓▓ 字符串解构

  字符串之所以能够解构是因为此时字符串转换成了一个数组

    let [a,b,c] = 'hello';
console.log(a); //h
console.log(b); //e
console.log(c); //l

▓▓▓▓▓▓ 数值和布尔值解构

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

    let {toString: s} = 123;
s === Number.prototype.toString // true let {toString: a} = true;
a === Boolean.prototype.toString // true

  上面代码中,数值和布尔值的包装对象都有tostring属性,因此变量s都能取到值。

  解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于null和undefined无法转为对象,所以对它们进行解构赋值,都会报错。

参考资料: 

        ECMAScript 6入门-阮一峰

ECMAScript6-解构的更多相关文章

  1. ECMAscript6新特性之解构赋值

    在以前,我们要对变量赋值,只能直接指定值.比如:var a = 1;var b = 2;但是发现这种写法写起来有点麻烦,一点都不简洁,而在ECMAScript6中引入了一种新的概念,那就是" ...

  2. ECMAScript6学习笔记 ——let、const、变量解构赋值

    let 不存在变量提升 通过let声明的变量仅在块级作用域内有效 不允许在同一个作用域内重复声明一个变量 防止值公用 var oUl = document.querySelectorAll('ul&g ...

  3. ECMAScript6 - 2.变量的解构赋值

    1.数组解构赋值 1.1.基本用法 // (1)对数组变量赋值 let [foo, [[bar], baz]] = [1, [[2], 3]]; foo; // 1 bar; // 2 baz; // ...

  4. ECMAScript6 入门教程记录 变量的解构赋值

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

  5. ES6新特性2:变量的解构赋值

    本文摘自ECMAScript6入门,转载请注明出处. ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring).不仅适用于var命令,也适用于let和c ...

  6. ES6 - 解构(数组和对象)

    解构对象 /** * 解构:快捷,方便 * * 对象解构 */ { var expense = { type: "es6", amount: "45" }; / ...

  7. 豪情-CSS解构系列之-新浪页面解构-01

    目录: 一. 新浪的布局特点 二. 内容细节的特点 三. 其中相关的一些基础技术点 1. 常见布局方法 2. 布局要点 3. Debugger误区 4.列表 5.字体颜色 6.CSS选择符 7.CSS ...

  8. es6之变量的解构赋值

    es5中通常我们声明变量都是以下的方式: var a = 10; var b = 20; var c = 30; //或者 var a = 10,b = 20,c = 30; //或者 var arr ...

  9. ES6之解构赋值

    截止到ES6,共有6种声明变量的方法,分别是var .function以及新增的let.const.import和class: 我们通常的赋值方法是: var foo='foo'; function ...

  10. 用vue.js学习es6(三):数组、对象和函数的解构

    一.数组的解构: 以前的方式: var arr = [1,2,3]; console.log(arr[0]); //1 console.log(arr[1]); //2 现在的方式: var [a,b ...

随机推荐

  1. jMeter入门实例

    在大家开始看的时候先声明这篇文章不是我写的我只是照着他讲的安装好了,我觉得很有用就想保留下来.分享给大家. 人们对从认识事物都有一个具体到抽象的过程,学习Jmeter也不例外,通过一个实例来进行学习, ...

  2. C语言——选择排序

    ---恢复内容开始--- 算法思想: n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果: ①初始状态:无序区为R[1..n],有序区为空. ②第1趟排序 在无序区R[1..n]中选出 ...

  3. shell-早间学习,每日一点-5

    http://www.cnblogs.com/liuling/p/2013-8-4-01.htmlhttp://www.cnblogs.com/stephen-liu74/category/32665 ...

  4. vim高亮设置

    vim高亮设置 前提: 查看vim是否完整安装 rpm -qa | grep vim 若完整安装,则会出现如下相关信息 vim-filesystem-7.4.629-5.el6.x86_64 vim- ...

  5. 纪中集训 Day 4

    今天(其实是昨天)不考试= = 所以就刷题了 = = 早上无所事事,想把几道题刷过却很不爽的全删了 下午觉得不能这样了,把BZOJ 过了两道水的DP (计算几何根本不会啊QAQ) 晚上先水了一题之后, ...

  6. 支持向量机(SVM)理论总结系列.线性可分(附带R程序案例:用体重和心脏重量来预测一只猫的性别)

    附注:不要问我为什么写这么快,是16年写的. 1.名词解释 支持向量机中的机:在机器学习领域,常把一些算法看做一个机器,如分类机(也叫作分类器) 2.问题描述 空间中有很多已知类别的点,现在想用一个面 ...

  7. java数组、泛型、集合在多态中的使用及对比

    我们在使用数组,泛型集合的过程中不可避免的会碰到多态,或者说什么情况下能如何使用父数组引用子数组(集合.泛型)呢? 数组在多态中的使用 元素为父类型的数组引用可指向元素为子类型的数组对象 当数组被调用 ...

  8. Memcached·Redis缓存的基本操作

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  9. jQuery的动态绑定事件的应用

    注意:bind()的事件绑定是只对当前页面选中的元素有效.如果你想对动态创建的元素bind()事件,是没有办法达到效果的 <script src="jquery-1.11.2.min. ...

  10. .NET 知识整理笔记

    本文纯属自己理解着写的,如果有什么错误或者不全面希望读者能够加以补充!~ 1.Web.Config配置文件的节点操作. 在Web.Config中写入. <configuration> &l ...