es6基础系列三:解构赋值
解构就是ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值(只能用于数组,对象或迭代器)。如果解构不成功,则等于undefined,但不能赋值为undefined和null,因为undefined和null不属于数组或对象
1 数组的解构赋值
数组的解构赋值就是,按照数组元素的次序,取出它位置所对应的值,具体如下
var [a, b, c] = [1, 2, 3]; // a=1;b=2;c=3 相当于var a=1, b=2, c=3;
// 也可以用于let,const声明变量
let [x, y] = [4, 5] // x=4, y=5
// 位置对应
var [, , c] = [1, 2, 3]; // c=3
var [a, b, c] = [, 2,]; // a=undefined; b=2; c=undefined
// 嵌套数组 位置对应
var [a, [[b], c]] = [1, [[2], 3]]; // a=1; b=2; c=3
// ...表示剩下的所有值组成数组
var [a, ...b] = [1, 2, 3, 4];// a=1; b=[2,3,4];
var [a, ...b, c] = [1, 2, 3, 4]; //报错 Uncaught SyntaxError: Rest element must be last element in array
var [a, ...b] = [1]; // a=1; b=[];
解构只能用于数组,对象或迭代器,重要的事再重复一遍
当然,解构赋值也允许指定默认值
var [a=1] = []; // a=1
var [a, b=2] = [1]; // a=1, b=2
var [a, b=2] = [1, undefined]; // a=1; b=2
var [a, b=2] = [1, null]; // a=1; b=null;
思考一下,下面输出的结果,let声明时为什么报错
var [x=y,y=1]=[]; // x=undefined; y=1
let [x=y,y=1]=[]; // 报错 Uncaught ReferenceError: y is not defined
2 对象的解构赋值
上面提到了,数组的解构赋值是按照元素的位置来取值的,而对象的解构赋值是按照属性名来取值的
具体请看下面的例子
// 属性名和变量名一致
var {a, b} = {a:"aa", b:"bb"}; // a="aa"; b="bb"
var {a, b} = {b:"bb"}; // a=undefined; b="bb" 变量名a因为找不到属性名a的值
// 属性名与变量名不一致
var {a:c, b:d} = {a: "aa", b:"bb", c:"cc", d:"dd"}; //c="aa"; d="bb" 属性名为a,变量名为c
//对象嵌套数组
var o = {
p: ["hello", {y: "world"}]
};
// 也支持let和const
let {p:[x, {y}]} = o;// x="hello"; y="world"; 注意:p为属性名而不是变量名
// 对象嵌套对象
var o = {
p: {
q: {
x: "hello",
y: "world"
}
}
};
var {p:{q:{x, y}}} = o; // x="hello"; y="world"; 注意p,q为属性名而不是变量名
为已经声明的变量进行解构赋值,必须把整个表达式用小括号包裹,否则会报错,报错原因就是因为JavaScript语法通知解析引擎将任何以{开始的语句解析为一个块语句(例如,{console}是一个合法块语句)
var x;
{x} = {x:1}; // 报错 Uncaught SyntaxError: Unexpected token =
({x} = {x:1}); // x=1
let obj = {};
let arr = [];
({ foo: obj.prop, bar: arr[0] } = { foo: 123, bar: true }); // obj={prop: 123}; arr=[true]; 注意区别属性名和变量名,foo,bar是属性名 obj.prop,arr[0]是变量名
3 解构赋值的用途
变换变量的值
var a = 1;
var b = 2;
[a, b] = [b, a]; // a=2; b=1;
函数取值
function func1(){
return [1, 2, 3];
}
var [a, b, c] = func1(); // a=1;b=2;c=3;
function func2(){
return {
a: "a",
b: "b"
}
}
var {a, b} = func2(); // a="a";b="b"
函数参数的定义及设置默认值
function func3({x, y, z}){
console.log(x+' '+y+' '+z);
}
func3({x:"x",y:"y",z:"z"});//x y z
function func4({x=1, y=2, z=3}){
console.log(x+' '+y+' '+z);
}
func4({});// 1 2 3
遍历Map结构
var map = new Map();
map.set('x','xx');
map.set('y','yy');
//获取键名和键值
for(let [key, value] of map){
console.log('key='+key+' value='+value);
//key=x value=xx
//key=y value=yy
}
//获取键名
for(let[key] of map){
console.log("key="+key);
// key=x
// key=y
}
// 获取键值
for(let[, value] of map){
console.log("value="+value);
// value=xx
// value=yy
}
4 思考题
为什么func5和func6的结果不一样,请注意为变量赋值和为函数的参数指定默认值
function func5({x=0, y=0}={}){
console.log([x,y]);
}
func5({x:3, y:8}); // [3, 8]
func5({x:3}); // [3, 0]
func5({}); // [0, 0]
func5(); // [0, 0]
function func6({ x, y } = { x: 0, y: 0 }){
console.log([x, y]);
}
func6({x:3, y:8}); // [3, 8];
func6({x:3}); // [3, undefined]
func6({}); // [undefined, undefined]
func6(); // [0, 0]
es6基础系列三:解构赋值的更多相关文章
- ES6基础-变量的解构赋值
作者 | Jeskson 来源 | 达达前端小酒馆 解构赋值: 数组的解构赋值,对象的解构赋值,字符串的解构赋值,数值与布尔值的解构赋值,函数参数的解构赋值. 开发环境准备: 编辑器,VS Code, ...
- 石川es6课程---6、解构赋值
石川es6课程---6.解构赋值 一.总结 一句话总结: 结构相同一一对应的方式赋值:let [json, arr, num, str] = [{ a: 1, b: 2 }, [1, 2, 3], 8 ...
- es6入门2--对象解构赋值
解构赋值:ES6允许按照一定规则从数组或对象中提取值,并对变量进行赋值.说直白点,等号两边的结构相同,右边的值会赋给左边的变量. 一.数组的解构赋值: 1.基本用法 let [a, b, c] = [ ...
- es6之变量的解构赋值
es5中通常我们声明变量都是以下的方式: var a = 10; var b = 20; var c = 30; //或者 var a = 10,b = 20,c = 30; //或者 var arr ...
- es6分享——变量的解构赋值
变量的解构赋值:ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前的写法: var a = 1; var b = 2; es6允许的写法 ...
- ES6 继续 变量的解构赋值
春节放假这几天,感觉跟梦一样,瞬间就过去了.现在上班的前几天,都感觉有点不真实,不过看到口袋里的钱,就知道,是真真实实的度过了这个假期. 现在得开始重新工作了: 变量的解构赋值 ES6 允许按照一定模 ...
- ES6入门——变量的解构赋值
1.数组的解构赋值 以前为变量复制,只能直接指定值.现在ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 本质上,这种写法属于模式匹配,只要等 ...
- ES6中变量的解构赋值
1.数组的解构赋值 基本用法 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 输出: 上面代码表示,可以从数组中提取值,按照对应位置,对变 ...
- ES6学习笔记之解构赋值
1.数组的解构赋值 简单用法 { // 旧 let a=1,b=3; //新 let [a,b]=[1,3]; console.log(a,b);// 1 3 } 只要等号两边的模式相同,左边的变量就 ...
随机推荐
- Java+MySql图片数据保存
之前一直没有做过涉及到图片存储的应用,最近要做的东东涉及到了这个点,就做了一个小的例子算是对图片存储的初试吧! 1.创建表: drop table if exists photo; CREATE TA ...
- CentOS7 + Python3 + Django(rest_framework) + MySQL + nginx + uwsgi 部署 API 开发环境, 记坑篇
CentOS7 + Python3 + Django(rest_framework) + MySQL + nginx + uwsgi 部署 API 开发环境 CentOS7 + Python3 + D ...
- Group By 和 Having, Where ,Order by执行顺序
1.Group By 和 Having, Where ,Order by这些关键字是按照如下顺序进行执行的:Where, Group By, Having, Order by. 首先where将最原始 ...
- 《python基础教程(第二版)》学习笔记 基础部分(第1章)
<python基础教程(第二版)>学习笔记 基础部分(第1章)python常用的IDE:Windows: IDLE(gui), Eclipse+PyDev; Python(command ...
- Kafka- Kafka架构功能
Kafka是一个高吞吐量的分布式消息系统,一个分布式的发布-订阅消息系统.Kafka是一种快速,可拓展的,设计内在就是分布式的,分区的可复制的提交日志服务. Apache Kafka与传统消息系统相比 ...
- CSS3制作分步注册表单
这个DEMO是使用CSS3制作的一个分步注册表单,每个input对应的是每一步,在表单得到焦点时,对应的step也会进行对应的改变.不过这个效果是使用js代码来实现,但整个表单的外观是由CSS3来完成 ...
- Python3 数据可视化之matplotlib、Pygal、requests
matplotlib的学习和使用 matplotlib的安装 pip3 install matplotlib 简单的折线图 import matplotlib.pyplot as plt #绘制简单的 ...
- javaScript-进阶篇(一)
1.变量 1.必须以字母.下划线或美元符号开头,后面可以跟字母.下划线.美元符号和数字. 2.变量名区分大小写,如:A与a是两个不同变量. 3.不允许使用JavaScript关键字和保留字做变量名. ...
- Skype SILK vs. iLBC vs. Speex
对比一下这三种VOIP语音算法的特点: 1 参数与特征 2 SILK性能 关于iLBC和Speex的性能可以参考以前写的文章. 3 关于VOIP一些观点(仅代表个人观点) 1) Skype 辛苦三年 ...
- 使用 py2exe 打包 Python 程序
上回在<使用 PyInstaller 打包 Python 程序>中,我们介绍了使用 PyInstaller 对 Python 程序进行打包,今天带大家认识一个新的工具:py2exe. 接下 ...