解构赋值的学习笔记-ES6系列2

解构赋值的学习参考了以下几位大大们的博客~仅为自己的学习笔记。
http://es6.ruanyifeng.com/#docs/destructuring

1. 基本用法

ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构赋值。
在以前,我们想要为变量赋值,只能直接指定值。如

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

在ES6中,可以为变量解构赋值,即

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

相当于一一对应,按照对应的位置来给对应的变量赋值。

1.1 数组的解构赋值

可以这样为数组的元素进行解构赋值:

let [ , , third] = ['a','b','c']
console.log(third) //c

也可以使用…代表解构从当前索引到最后索引的值,赋值为一个数组:

let [head,...tail] = [1,2,3,4]
console.log(head) // 1
console.log(tail) // [2,3,4]

如果结构不成功,变量的值等于undefined

let [x,y,...z] = ['a']
console.log(x) //a
console.log(y) //undefined
console.log(z) //[]

如果等号的右边不是数组(严格来说,不是可遍历的结构),就会报错。

let [foo] = 1 //报错

1.2 默认值

解构赋值允许指定默认值

let [x,y = 'b'] = ['a']
console.log(x) // a
console.log(y) // b

默认值可以引用其他变量,但该变量必须已经被声明。

let [x=1,y=x] = [];
console.log(x) // 1
console.log(y) // 1

若写成下面会报错,因为变量y还未声明。

let[x=y,y=1]=[] //报错

1.3 对象的解构赋值

解构不仅可以用于数组,还可以用于对象

let {foo, bar} = {foo:'aaa', bar:'bbb'}
console.log(foo) //'aaa'
console.log(bar) //'bbb'

与数组的解构赋值不同,数组的解构是按照索引来的,而对象的解构是按照命名来的。
也就是说,变量必须与属性同名,才能取到正确的值。

let {baz} = {foo:'aaa', bar:'bbb'};
console.log(baz) //undefined

如果变量名和属性名不一致,必须写成下面这个样子才能取到正确的值。

let {foo:baz} = {foo:'aaa',bar:'bbb'};
console.log(baz) // 'aaa'

对象的结构赋值,可以很方便地将现有对象的方法,赋值到某个变量中。
例如我们常用的console.log,其实就是console对象的log方法,用于打印输出语句。我们尝试着将console.log用一个log来实现。

let {log} = console;
log("hello解构")

在这里插入图片描述

1.4 嵌套的解构赋值

解构可以用于嵌套结构的对象,如

let obj = {
	p:['Hello',{y:'World'}]
}
let {p:[x,{y}]} = obj
console.log(x) //'Hello'
console.log(y) //'World'
console.log(p) //报错

在这里插入图片描述
在这里,p是模式,不是变量,因此不会被赋值。如果想要p作为变量被赋值,应当写成:

let obj = {
	p:['Hello',{y:'World'}]
}
let {p, p:[x,{y}]} = obj
console.log(x) //'Hello'
console.log(y) //'World'
console.log(p) //['Hello',{y:'World'}]

在这里插入图片描述

1.5 字符串的解构赋值

字符串也可以解构赋值。在进行结构赋值时,字符串被转换成了一个类似数组的对象,且具有length属性。

let str = 'hello'
let [a,b,c,d,e]= str
let {length:len} = str
console.log(a) //h
console.log(b) //e
console.log(c) //l
console.log(d) //l
console.log(e) //o
console.log(len) //5

在这里插入图片描述

1.6 函数参数的结构赋值

函数的参数也可以使用解构赋值

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

函数参数的解构也可以使用默认值

function move({x=0, y=0}={}){
	return [x,y];
}
console.log(move()); // [0,0]
console.log(move({x:3})) // [3,0]

函数move的参数是一个对象,通过对这个对象进行解构,得到变量x和y的值。如果无法解构到对应的值,则变量x和y使用其默认值。

2. 解构赋值的用途

2.1 变换变量的值

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

2.2 从函数返回的对象中取值

//若函数返回数组
function returnArray(){
	return [1,2,3]
}
let [a,b,c] = returnArray();
//若函数返回对象
function returnObj(){
	return{
		foo:1;
		bar:2;
	}
}
let {foo,bar} = returnObj();

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

2.4 输入模块的指定方法

const {methodA,methodB} = require("method-module")

2.5 遍历map结构

任何部署了Iterator接口的对象,都可以用for…of循环遍历。使用解构赋值获取键名和键值非常方便

const map = new Map()
map.set('first','hello');
map.set('second','world');

for(let [key,value] of map)
{
	console.log(key + " is " + value);
}

在这里插入图片描述
如果只想获取键名或者只获取键值,可以写成下面这样:

//获取键名
for(let [key] of map){
}
//获取键值
for(let [,value] of map){
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值