飞道的博客

es6解构赋值的几个用法

281人阅读  评论(0)

1.解构赋值可以轻松获取对象或者数组中的数据


  
  1. var jsonData = {
  2. data: "111",
  3. data2: [ "test", "test2"],
  4.   
  5. };

json中的数据就被轻松获取;

2.解构复制可以交换变量


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

结果: a=4,b=3,c=2,d=1

赋值的过程需要保证两边的数据格式匹配

[a,b,c,d]=[d,c,b,];

d的值将为underfinded

3.对象的解构赋值


  
  1. let {obj, obj2 } = { obj: "666", obj2: "888" };
  2. console.log(obj,obj2)

结果,666,888

数组解构

让我们一起先来看数组解构的基本用法:


  
  1. let [a, b, c] = [ 1, 2, 3] // a=1, b=2, c=3
  2. let [d, [e], f] = [ 1, [ 2], 3] // 嵌套数组解构 d=1, e=2, f=3
  3. let [g, ...h] = [ 1, 2, 3] // 数组拆分 g=1, h=[2, 3]
  4. let [i,,j] = [ 1, 2, 3] // 不连续解构 i=1, j=3
  5. let [k,l] = [ 1, 2, 3] // 不完全解构 k=1, l=2

对象解构

接下来再让我们一起看看对象解构的基本用法:


  
  1. let {a, b} = { a: 'aaaa', b: 'bbbb'} // a='aaaa' b='bbbb'
  2. let obj = { d: 'aaaa', e: { f: 'bbbb'}}
  3. let {d, e:{f}} = obj // 嵌套解构 d='aaaa' f='bbbb'
  4. let g;
  5. (g = { g: 'aaaa'}) // 以声明变量解构 g='aaaa'
  6. let [h, i, j, k] = 'nice' // 字符串解构 h='n' i='i' j='c' k='e'

使用场景

1.变量赋值

我们先来看最基本的使用场景:变量赋值,先来看我们在平时开发中是怎么使用es5对变量赋值的:


  
  1. var data = { userName: 'aaaa', password: 123456}
  2. var userName = data.userName
  3. var password = data.password
  4. console.log(userName)
  5. console.log(password)
  6. var data1 = [ 'aaaa', 123456]
  7. var userName1 = data1[ 0]
  8. var password1 = data1[ 1]
  9. console.log(userName1)
  10. console.log(password1)

上面两个例子是最简单的例子,用传统es5变量赋值,然后调用,这么写的问题就是显得代码啰嗦,明明一行可以搞定的事情非要用三行代码,来看看解构赋值是怎么干的:


  
  1. const {userName, password} = { userName: 'aaaa', password: 123456}
  2. console.log(userName)
  3. console.log(password)
  4. const [userName1, password1] = [ 'aaaa', 123456]
  5. console.log(userName1)
  6. console.log(password1)

相对于es5的语法是不是更加简单明了,在数据量越大用解构赋值的优势越明显

2.函数参数的定义

一般我们在定义函数的时候,如果函数有多个参数时,在es5语法中函数调用时参数必须一一对应,否则就会出现赋值错误的情况,来看一个例子:


  
  1. function personInfo(name, age, address, gender) {
  2. console.log(name, age, address, gender)
  3. }
  4. personInfo( 'william', 18, 'changsha', 'man')

 上面这个例子在对用户信息的时候需要传递四个参数,且需要一一对应,这样就会极易出现参数顺序传错的情况,从而导致bug,接下来来看es6解构赋值是怎么解决这个问题的:


  
  1. function personInfo({name, age, address, gender}) {
  2. console.log(name, age, address, gender)
  3. }
  4. personInfo({ gender: 'man', address: 'changsha', name: 'william', age: 18})

 

这么写我们只需要知道要传什么参数就行来,不需要知道参数的顺序也没问题

3.交换变量的值

在es5中我们需要交换两个变量的值需要借助临时变量的帮助,来看一个例子:


  
  1. var a= 1, b= 2, c
  2. c = a
  3. a = b
  4. b = c
  5. console.log(a, b)

 

来看es6怎么实现:


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

是不是比es5的写法更加方便呢?

4.函数的默认参数

在日常开发中,经常会有这种情况:函数的参数需要默认值,如果没有默认值在使用的时候就会报错,来看es5中是怎么做的:


  
  1. function saveInfo(name, age, address, gender) {
  2. name = name || 'william'
  3. age = age || 18
  4. address = address || 'changsha'
  5. gender = gender || 'man'
  6. console.log(name, age, address, gender)
  7. }
  8. saveInfo()

在函数离 main先对参数做一个默认值赋值,然后再使用避免使用的过程中报错,再来看es6中的使用的方法:


  
  1. function saveInfo({name= 'william', age= 18, address= 'changsha', gender= 'man'} = {}) {
  2. console.log(name, age, address, gender)
  3. }
  4. saveInfo()

在函数定义的时候就定义了默认参数,这样就免了后面给参数赋值默认值的过程,是不是看起来简单多了

5.提取 JSON 数据


  
  1. let jsonData = {
  2. id: 42,
  3. status: "OK",
  4. data: [ 867, 5309]
  5. };
  6. let { id, status, data: number } = jsonData;
  7. console.log(id, status, number);
  8. // 42, "OK", [867, 5309]

 

6.遍历 Map 结构

任何部署了 Iterator 接口的对象,都可以用for...of循环遍历。Map 结构原生支持 Iterator 接口,配合变量的解构赋值,获取键名和键值就非常方便。


  
  1. const map = new Map();
  2. map. set( 'first', 'hello');
  3. map. set( 'second', 'world');
  4. for ( let [key, value] of map) {
  5. console.log(key + " is " + value);
  6. }
  7. // first is hello
  8. // second is world

如果只想获取键名,或者只想获取键值,可以写成下面这样。


  
  1. // 获取键名
  2. for ( let [key] of map) {
  3. // ...
  4. }
  5. // 获取键值
  6. for ( let [,value] of map) {
  7. // ...
  8. }

7.输入模块的指定方法

加载模块时,往往需要指定输入哪些方法。解构赋值使得输入语句非常清晰。

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

 


转载:https://blog.csdn.net/zhangchen124/article/details/104482115
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场