1.数组的解构赋值

我们知道以前我们给一个变量赋值要这样如下:


let a = 1;
let b = 2;
let c = 3;

但是ES6出来之后,我们可以这样:


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

以上就是从数组中提起值,一一对应赋值,a、b、c分别为1、2、3


let [aa, [[bb], cc]] = [1, [[2], 3]]

aa,bb,cc分别对应1,2,3


let [,,d] = [10, 20, 30];
console.log(d);

d的值为30


let [e, ...f] = [1, 2, 3, 4, 5];

e为1, f为[2,3,4,5]


let [x, y, ...z] = [1];

x为1,y为undefined,z为[],如果没有对应值会等于undefined

解构赋值也允许默认值, 如下:


let [ x = '默认值'] = [];

x的值为默认值


let [ a = 123 ] = [ undefined ];
let [ b = 321 ] = [ null ];

a的值为123,b的值为321,因为ES6中是严格遵循(===),所以只有当数组对应的值为undefined的时候,才能等于默认值

默认值可以引用解构赋值的其他变量,但是这个变量必须得声明过的,如下:


let [ a = 0, b = a] = [];

这里a、b分别为0,0

但是如果这个变量没有声明,就会报错,如下:


let [ a = b, b = 1] = [];

这里就会报错:Uncaught ReferenceError: b is not defined

2.对象的解构赋值


let { a, b } = { a: 1, b: 2 };

a,b的值为1,2

对象解构赋值可以无需按照顺序一一对应,但是括号两边的变量名称和属性名称要相同,才能取到正确值


let { a, b } = { a: 1, c : 2};

a为1,b为undefined,这里b在右边括号中没有对应的属性值与其对应,所以此时b为undefined

如果变量名和属性名不一样,则要按照如下写:


let { aa: fa, bb: fb } = { aa: 1, bb: 2 };

fa为1,fb为2

这里可以说明,对象解构赋值实际上是如下的简写:


let { aa: aa, bb: bb } = { aa: 1, bb: 2}

也就是说,对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。


let { aa: fa } = { aa: 1 } //fa为 1
//aa为 Uncaught ReferenceError: aa is not defined

这里就说明了,fa是真正被赋值的,此时的aa是模式而不是变量,如果你要让aa为变量,则如下:


{
let { aa: fa, aa } = { aa: 1 };
// aa 为 1
// fa 为 1
}

此时aa为1,bb为1,此时aa就是变量了

当然对象也可以多层嵌套如下:


{
let obj = {
p: [1, { y: 2 }]
} let { p: [x, { y }]} = obj;
console.log(x); // 1
console.log(y); // 2
}

{
let obj = {};
let arr = [];
({a: obj.name, b: arr[0] } = { a: 321, b: 123}); console.log(obj); // { name: 321 }
console.log(arr); // [123]
}

对象解构默认值:


{
let { x = 1 } = {};
console.log(x); //1
} {
let { x : y = 4 } = {};
console.log(y); //4
} {
let { x : y = 4 } = { x: 5};
console.log(y); //5
}

默认属性生效条件必须是对象的属性严格等于undefined,如果是null就不会生效,如下:


{
let { x = 1 } = { x : null};
console.log(x); //null
}

已声明的变量解构赋值:


{
let x;
({ x } = { x : 1 });
console.log(1); // 1
}

得要加个小括号才可以,否则会报错;

数组对应对象属性的解构:


{
let arr = [1, 2, 3];
let { 0 : one, [arr.length-1] : three } = arr;
console.log(one); // 1
console.log(three); // 3
}

3.字符串的解构赋值

字符串也可以解构赋值,因为字符串可以转换成一个类似数组的对象


{
let [a, b, c, d] = 'hero'; console.log(a); //h
console.log(b); //e
console.log(c); //r
console.log(d); //o
}

类似数组的对象都有一个length属性,可以对这个属性解构赋值


{
let { length: len } = 'hero';
console.log(len); // 4
}

4.数值和布尔值的解构赋值

解构赋值时,如果等号右边是数值或者布尔值时,则会先转换成对象


{
let { toString: s } = 123;
console.log(s === Number.prototype.toString); //true
} {
let { toString: s } = true;
console.log(s === Boolean.prototype.toString); //true
}

解构赋值的规则:如果等号右边的值不是对象或者数组则会先转为对象,由于undefined和null无法转为对象,所以无法对它们进行解构赋值,会报错,如下:


{
let { props: x} = undefined; //报错
let { props: y} = null; //报错
}

5.函数参数的解构赋值


{
const arr = [[1,2],[3,4]].map(([a, b])=> a+b);
console.log(arr); //[3,7]
}

函数参数默认值:


function func({x = 0, y = 0} = {}) {
return [x, y];
} console.log(func({x:5,y:6})); //[5,6]
console.log(func({x:5})); //[5,0]
console.log(func({})); //[0, 0]
console.log(func()); //[0, 0]

如果按照以下定义就不同了,如下:


function fn({x, y} = { x: 1, y: 2}) {
return [x, y];
}
console.log(fn({ x: 11, y: 22})); // [11, 22]
console.log(fn({ x: 11 })); // [11, undefined]
console.log(fn({})); // [undefined, undefined]
console.log(fn()); // [1, 2]

undefined会触发函数参数的默认值,如下:


{
const a = [1, undefined, 3].map((x = 'noundefine') => x);
console.log(a); //[1, "noundefine", 3]
}

6.圆括号问题

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


[(b)] = [3]; // 正确
({ p: (d) } = {}); // 正确
[(parseInt.prop)] = [3]; // 正确

上面三行语句都可以正确执行,因为首先它们都是赋值语句,而不是声明语句;其次它们的圆括号都不属于模式的一部分。第一行语句中,模式是取数组的第一个成员,跟圆括号无关;第二行语句中,模式是p,而不是d;第三行语句与第一行语句的性质一致。

本文参考链接:http://es6.ruanyifeng.com/#do...
主要是看了阮一峰老师的文章,自己整理了一下,供后期自己看笔记用的

来源:https://segmentfault.com/a/1190000017416618

ES6精解:变量的解构赋值的更多相关文章

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

    前言:什么是ES6?ECMAScript 6(简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了.其中相比较于ES5新增了诸多的特性,并且ES6可转换为ES5的语法.- ...

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

    1.解构赋值的定义 在ES6中,允许按照一定模式,从数组和对象中提取值(所谓解构),然后对变量进行赋值. var a = 1; var b = 2; var c = 3; //等价于 var [a, ...

  3. ES6学习历程(变量的解构赋值)

    一.数组的解构赋值 1.举几个例子足以理解 let [a, b, c] = [1, 2, 3]; a:1;  b:2;  c:3; let [x, , y] = [1, 2, 3];  x:1   y ...

  4. ES6学习4 变量的解构赋值

    变量的解构赋值 一.数组结构赋值 1.数组结构赋值 let [a, b, c] = [1, 2, 3]; ES6 可以从数组中提取值,按照对应位置,对变量赋值. 1)  本质上,这种写法属于“模式匹配 ...

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

    前言 在上一章 ES6入门之let和const命令中我们对ES6的相关语法已经有了初步了解,上一章中我们主要学习了三大部分的内容,let命令的使用,块级作用域,const命令的使用,那么从本篇博客将进 ...

  6. ES6中的变量的解构赋值, 解放我们的双手,实现变量的批量赋值

    ES6--变量的解构赋值 引言 正文 一.数组的解构赋值 解构失败 不完全解构 默认值 二.对象的解构赋值 三.字符串的解构赋值 结束语 引言 变量的解构赋值, 听起来很复杂, 简单点说可以理解成批量 ...

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

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

  8. es6变量声明和解构赋值

    /*声明: * 本文内容多为学习借鉴性内容,大部分非原创 * 特别感谢阮一峰的 ECMAScript6 入门,推荐大家学习 */ 一.es5变量声明的不足 1.变量提升和函数声明提升 es5的代码加载 ...

  9. es6基础入门变量的解构赋值

    let [a, b, c] = [1, 2, 3]; let [foo, [[bar], baz]] = [1, [[2], 3]]; foo bar baz let [ , , third] = [ ...

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

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

随机推荐

  1. Spring Security初识

    Spring Security与Spring Boot集成 添加依赖: <dependency> <groupId>org.springframework.boot</g ...

  2. 【LuoguP3348】[ZJOI2016]大森林

    题目链接 题目描述 小Y家里有一个大森林,里面有n棵树,编号从1到n.一开始这些树都只是树苗,只有一个节点,标号为1.这些树都有一个特殊的节点,我们称之为生长节点,这些节点有生长出子节点的能力. 小Y ...

  3. iOS Core Image-----十行代码实现微信朋友圈模糊效果

    昨天下午微信的朋友圈着实火了一把,在这之后好多程序员都通过抓包工具看到了原图,但是我却在想,网上说是在移动前端做到的那是怎么做到的呢,经过一些学习,终于掌握了一些Core Image的知识,做出了相应 ...

  4. 3,ActiveMQ-入门(基于JMS发布订阅模型)

    一.Pub/Sub-发布/订阅消息传递模型 在发布/订阅消息模型中,发布者发布一个消息,该消息通过topic传递给所有的客户端.在这种模型中,发布者和订阅者彼此不知道对方,是匿名的且可以动态发布和订阅 ...

  5. Mysql数据库表类型

    MySQL的数据表类型很多,其中比较重要的是MyISAM,InnoDB这两种. 这两种类型各有优缺点,需要根据实际情况选择适合的,MySQL支持对不同的表设置不同的类型.下面做个对比:   MyISA ...

  6. HDU 4300 Clairewd's message ( 拓展KMP )

    题意 : 给你一个包含26个小写字母的明文密文转换信息字符串str,第一个表示'a'对应的密文是str[0].'b'对应str[1]……以此类推.接下来一行给你一个另一个字符串,这个字符串由密文+明文 ...

  7. Socket网络通信编程(二)

    1.Netty初步 2.HelloWorld 3.Netty核心技术之(TCP拆包和粘包问题) 4.Netty核心技术之(编解码技术) 5.Netty的UDP实现 6.Netty的WebSocket实 ...

  8. POJ 1380 Equipment Box (暴力枚举)

    Equipment Box 题目链接: http://acm.hust.edu.cn/vjudge/contest/130510#problem/B Description There is a la ...

  9. 在阿里云虚拟主机上部署Laravel

    拿laravel5.1来说: 在根目录下创建一个local文件夹,把网站根目录下除了public文件夹以外所有文件及文件夹剪切到local文件夹中 然后把public文件夹下的所有文件剪切到网站根目录 ...

  10. 搜狗词库转txt

    #环境需求 Python2 1 #!/bin/python # -*- coding: utf- -*- import struct import sys import binascii import ...