解构赋值:ES6允许按照一定规则从数组或对象中提取值,并对变量进行赋值。说直白点,等号两边的结构相同,右边的值会赋给左边的变量。

一、数组的解构赋值:

1.基本用法

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

2.不完全解构---右边提供的值要比变量多

let [[i]] = [[1, 2], 3];
console.log(i); //

3.解构赋值失败为undefined

let [j] = [];
console.log(j); //undefined

4.支持解构赋值提供默认值

let [k = 1, l = 2] = [3];
console.log(k, l); //3,2
规则是先看右边的值是否严格等于undefined,如果是undefined才会用默认值,除此之外,都是优先用右边提供的值。
let [m = 1, n = 2] = [undefined, null];
console.log(m, n); //1,null

默认值支持是一个表达式,比如一个函数,赋值规则还是遵守先看右边是否为undefined。

function func1() {
return 2;
}
let [o = func1()] = [1];
console.log(o); //

等同于以下代码:

let o;
if ([1][0] === undefined) {
o = func1();
} else {
o = [1][0];
}

默认值支持使用别的变量,但前提是这个变量已经提前声明,否则会报错。

let [p = 1, q = p] = [];
console.log(p, q); //1,1

二、对象的解构赋值

1.基本用法

对象解构赋值与数组有些不同,数组像按照等号对称的赋值,而对象是按照key名相同赋值,与顺序无关
let { a, b } = { b: 1, a: 2 };
console.log(a, b); //2,1
按照直觉,a赋值的过程是,从右边找a,如果有,就将右边a的值赋给左边a。但变量解构赋值的本质其实是这样的,前面的a只是作为匹配的依据,后者才是赋值的变量与值。
上面的代码等同于这样:
let { a: a, b: b } = { b: 1, a: 2 };
console.log(a, b); //2,1

不信我们做个测试,看下面的代码,a只是用于做匹配,后者才是赋值。

let { a: b } = { a: 2 };
console.log(b); //

2.变量解构嵌套使用

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

3.变量解构赋值失败

如果解构嵌套的是对象,且这个对象的父对象在右边不存在,当解构赋值时,会报错,原因是这个变量右边没有为undefined,从undefined中读取任意属性是非法操作。
let {a: { b }} = { c: { b: 1 } };
console.log(b); //报错

4.变量解构赋值存在继承关系

let obj1 = {};
let obj2 = { a: 1 };
Object.setPrototypeOf(obj1, obj2);
let {a} = obj1
console.log(a)//

5.对象解构赋值也存在默认值

对象解构赋值也支持默认值,规则与数组类似,只有右边的值严格等于undefined,左边的默认值才会生效。
let {a=1,b=2} = {a:undefined,b:null};
console.log(a,b)//1,null

6.对象解构与数组解构的混合使用

因为数组本身也属于特殊对象,所以混合使用并不非法。

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

上述代码等同于以下代码,以数组下标(索引作为key)

let {0:a,[arr.length-1]:b} = [0:1,1:2,2:3];

 三、字符串解构赋值

字符串解构赋值时,字符串会转为一个类数组。
let [a, b, c, d] = "love";
console.log(a,b,c,d)//l,o,v,e

因为是类数组,所以自然拥有length属性,我们也可以读取length属性进行赋值。

let { length: a } = "love";
console.log(a); //

四、函数参数解构赋值

规则符合参考数组,对象的解构赋值

function add([a, b]) {
return a + b;
};
add([1,2])//

所以函数解构赋值肯定是支持使用默认值的

function add([a = 1, b = 2] = []) {
console.log(a + b);
}
add(); //
add([3,4]);//

五、使用解构赋值的好处

1.变量交换值--笔试有这样的题目

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

2.让函数返回多个值

如果让函数返回多个值,我们可以将这些值放在数组或对象里,但是取值就麻烦了,还要遍历,使用解构赋值就方便很多

function func1() {
return [1, 2, 3];
}
let [a, b, c] = func1();
console.log(a, b, c); //1,2,3
function func2() {
return {
a: 1,
b: 2
};
}
let { a, b } = func2();
console.log(a, b); //1,2

3.让函数参数有所对应

默认给函数参数,参数取值都是按顺序取用户传递的值,但是使用了解构赋值,就不需要按照顺序传递了。

function add(a,b){
console.log(a,b)
};
add(1,2)//1,2
//不按照顺序
function add2({b,a}){
console.log(a,b)
};
add2({a:1,b:2})//1,2

4.提取JSON数据

let jsonData = {
'name': "echo",
'age': 26,
'address': "深圳"
};
let { name, age, address } = jsonData;
console.log(name, age, address);

5.为函数形参添加默认值

传统写法:

function add(x, y) {
var a = a || 1;
var b = b || 2
console.log(a + b);
}
add()//

解构赋值写法:

function add({ a = 1, b = 2 } = {}) {
console.log(a + b);
}
add(); //
add({ a: 4, b: 5 }); //

 6.遍历Map解构

解构赋值能为for...of遍历取值提供遍历,这个只是点我还没看到,先记录

const map = new Map();
map.set(1, 2);
map.set('a', 'b');
for (let [key, value] of map) {
console.log(key + "is" + value);//1isa 2isb
};

当然,你可以只取key或者value,像这样:

for (let [key] of map) {
}
for (let [, value] of map) {
}

7.模块引入方法

只是为不同变量赋予不同的引入方法,利用解构赋值可以为多个变量赋值,比较方便。

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

es6入门2--对象解构赋值的更多相关文章

  1. ES6入门——变量的解构赋值

    1.数组的解构赋值 以前为变量复制,只能直接指定值.现在ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 本质上,这种写法属于模式匹配,只要等 ...

  2. es6之变量的解构赋值

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

  3. ES6基础-变量的解构赋值

    作者 | Jeskson 来源 | 达达前端小酒馆 解构赋值: 数组的解构赋值,对象的解构赋值,字符串的解构赋值,数值与布尔值的解构赋值,函数参数的解构赋值. 开发环境准备: 编辑器,VS Code, ...

  4. ES6 中变量的解构赋值

    1. 数组的解构赋值 解构: ES6 中允许按照一定的模式从数组和对象中提取值,然后对变量进行赋值,这被称为解构(Destructuring). 1. 基本用法 本质上,这种写法属于"模式匹 ...

  5. 石川es6课程---6、解构赋值

    石川es6课程---6.解构赋值 一.总结 一句话总结: 结构相同一一对应的方式赋值:let [json, arr, num, str] = [{ a: 1, b: 2 }, [1, 2, 3], 8 ...

  6. 关于ES6 的对象解构赋值

    之 前写了关于ES6数组的解构 现在 go on ; 解构不仅可以用于数组,还可以用于对象: 对象的解构和数组有一个重要的不同.数组的元素是按次序排列的,变量的取值是由他的位置决定的:而对象的属性没有 ...

  7. ES6 对象解构赋值(浅拷贝 VS 深拷贝)

    对象的扩展运算符(...)用于取出参数对象的所有可遍历属性,拷贝到当前对象之中. 拷贝对象 let aa = { age: 18, name: 'aaa' } let bb = {...aa}; co ...

  8. 【ES6 】ES6 解构赋值--对象解构赋值

    对象的解构与数组有一个重要的不同. 数组的元素是按次序排列的,变量的取值由它的位置决定 而对象的属性没有次序,变量必须与属性同名,才能取到正确的值. 基本用法 如果解构失败,变量的值等于undefin ...

  9. es6分享——变量的解构赋值

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

随机推荐

  1. nlp L1

    前向最大匹配: 最大匹配出的词必须保证下一个扫描不是词表中的词或词的前缀才可以结束. 正向最大匹配算法:从左到右将待分词文本中的几个连续字符与词表匹配,如果匹配上,则切分出一个词.但这里有一个问题:要 ...

  2. LinkeList 特有方法

    LinkedList:特有方法:addFirst();addLast();添加元素到集合,添加到头尾,getFirst();getLast();获取元素,但不删除元素.如果集合中没有元素,会出现NoS ...

  3. Python 获取车票信息

    提示:该代码仅供学习使用,切勿滥用!!! 先来一个git地址:https://gitee.com/wang_li/li_wang 效果图: 逻辑: 1.获取Json文件的内容 2.根据信息生成URL ...

  4. opencv2.4.13+python2.7学习笔记--OpenCV中的图像处理--图像轮廓

    阅读对象:无要求. 1.代码 ''' OpenCV中的轮廓 轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度.为了更加准确,要使用二值化图像.在寻找轮廓之前,要进行阈值化 ...

  5. 【原创】IO流:读写操作研究(输入流)

    默写代码(以下问题要求能默写,不翻书不百度) 输入 问题一:从文件abc.txt中读取数据到字节数组并打印出来. 分析:如果读取数据,首先第一个问题,数据有多少?如果数据量不确定,如果确定字节数组大小 ...

  6. HTML5开发和布局(待补充)

    移动开发准则 1.尽量使用单页面开发(SPA) 2.慎选UI框架 3.动画.特效使用(60fps) **浏览器消耗最小的CSS属性** 位置:transform:translate(x,y,z) 大小 ...

  7. api controller 接口接收json字符串参数

    {"data":{"alarmRepeatTimes":2,"currentMode":1,"moduleResetTimeout ...

  8. react native (1) 新建页面并跳转

    新建页面 1.新建文件 import React from 'react'; import { Text } from 'react-native'; export default class tod ...

  9. Django关联数据库时报错TypeError: __init__() missing 1 required positional argument: 'on_delete'

    sgrade = models.ForeignKey("Grades",) 执行python manage.py makemigrations后出现TypeError: __ini ...

  10. Python之旅Day6 模块应用

    time datetime random os sys shutil pickle json shelv xml configparser hashlib subprocess logging re ...