解构的作用是可以快速取得数组或对象当中的元素或属性,而无需使用arr[x]或者obj[key]等传统方式进行赋值

var arr = [1, 2, 3];

//传统方式
var a = arr[0], b = arr[1], c = arr[2];
console.log(a, b, c); // 1 2 3 //解构方式
var [a, b, c] = arr;
console.log(a, b, c); // 1 2 3

从上面的例子我们可以看出,要想获取一个数组中的值,我们可以利用传统的索引的方式,也可以声明一个数组变量来获取,第二种方式看起来更优雅。

如果上面的方法看起来我们的传统方法还过得去的话看下面的例子:

var arr = [1, [2, [3]]];

// 传统方法
var a = arr[0], b = arr[1][0], c = arr[1][1][0];
console.log(a, b, c);// 1 2 3 // 解构方法
var [a, [b, [c]]] = arr;
console.log(a, b, c);// 1 2 3

多层数组嵌套的话我们就可以看出解构的强大之处了。再看下面的例子:

var arr = [1, 2, 3];

// 传统方式
function bar(a, b, c) {
console.log(a, b, c);
}
bar(arr[0], arr[1], arr[2]); // 1 2 3 // 解构方式
function baz([a, b, c]) {
console.log(a, b, c);
}
baz(arr); // 1 2 3

我们将一个数组传值应用到实际的应用中,可以是代码看起来更加简洁优雅,在多层数组中更能体现出来,如下:

var arr = [[1, 2], [3, 4], [5, 6]];

// 传统方法
for (var a of arr) {
// 第一种
console.log(a[0], a[1]); // 1 2 3 4 5 6
// 第二种
for (var b of a) {
console.log(b) // 1 2 3 4 5 6
}
} // 解构方法
for (var [a, b] of arr) {
console.log(a, b); // 1 2 3 4 5 6
}

我们要分别获取 arr 数组中的值,如果不去下标索引的话传统方式需要两层循环才能获取,如果用解构的话只需要循环一次,从而加快了运行速度。如果数组嵌套层数更多的话效果更明显。

对象赋值解构:

var obj = {
name: 'zhangsan',
sex: 0,
age: 26,
son: {
sonname: 'lisi',
sonsex: 1,
sonage: 2
}
}; var {name, sex, age, son} = obj;
console.log(name, sex, age); //zhangsan 0 26
console.log(son); // { sonname: 'lisi', sonsex: 1, sonage: 2 } var {name, sex, age, son:{sonname,sonsex,sonage}} = obj;
console.log(name,sex,age,sonname,sonsex,sonage); // zhangsan 0 26 lisi 1 2

但是如果对象的子对象中又重名的就需要在解构时重命名,如下:

var obj = {
name: 'zhangsan',
sex: 0,
age: 26,
son: {
name: 'lisi',
sex: 1,
age: 2
}
}; var {name, sex, age, son} = obj;
console.log(name, sex, age); //zhangsan 0 26
console.log(son); // { name: 'lisi', sex: 1, age: 2 } var {name, sex, age, son: {name, sex, age}} = obj;
console.log(name, sex, age, name, sex, age); // lisi 1 2 lisi 1 2 var {name, sex, age, son: {name: sonname, sex: sonsex, age: sonage}} = obj;
console.log(name, sex, age, sonname, sonsex, sonage); // zhangsan 0 26 lisi 1 2

如果对象的子对象中有和父对象重名的变量名称,则会将父对象的变量值覆盖,重命名子对象的变量则不会,重命名规则为 (原变量名:新变量名)。

同样的我们也可以将对象解构应用到函数传参中,如下:

var obj = {
name: 'zhangsan',
sex: 0,
age: 26,
son: {
name: 'lisi',
sex: 1,
age: 2
}
}; // 传统方法
function foo(name,sex,age,son) {
console.log(name,sex,age,son)
}
foo(obj.name,obj.sex,obj.age,obj.son); // zhangsan 0 26 { name: 'lisi', sex: 1, age: 2 } // 解构方法
function foo({name,sex,age,son}) {
console.log(name,sex,age,son)
}
foo(obj); // zhangsan 0 26 { name: 'lisi', sex: 1, age: 2 } // 解构方法 子对象也进行解构,但是子对象中含有和父对象相同的变量名,不重命名会报错
function foo({name, sex, age, son: {name, sex, age}}) {
console.log(name, sex, age, name, sex, age); // SyntaxError: Duplicate parameter name not allowed in this context
}
foo(obj); // SyntaxError: Duplicate parameter name not allowed in this context // 解构方法 子对象也进行解构,但是子对象中含有和父对象相同的变量名,将子对象重命名
function foo({name, sex, age, son: {name: sonname, sex: sonsex, age: sonage}}) {
console.log(name, sex, age, sonname, sonsex, sonage);
} foo(obj); // zhangsan 0 26 lisi 1 2

在上述方法中如果子对象也进行解构,子对象中有和父对象相同的变量名,则需要将子对象中和父对象相同的变量名进行重命名,当然也可以重命名父对象。只要没有相同的变量名即可。

解构也可以将数组与对象组合起来使用,如下循环结构:

var arr = [{name: 'aaa', age: 26}, {name: 'bbb', age: 27}, {name: 'ccc', age: 28}];

for (var {age, name} of arr) {
console.log(name, age);
}
//aaa 26
//bbb 27
//ccc 28

解构的特殊应用场景:

//变量互换
var x = 1, y = 2;
var [x, y] = [y, x];
console.log(x, y); // 2 1 //字符串解构
var str = 'hello';
var [a, b, c, d, e] = str;
console.log(a, b, c, d, e); // h e l l o

javascript ES6 新特性之 解构的更多相关文章

  1. JavaScript ES6 新特性详解

    JavaScript ES6 带来了新的语法和新的强大功能,使您的代码更现代,更易读 const ,  let and var 的区别: const , let 是 ES6 中用于声明变量的新关键字. ...

  2. ES6新特性之解构使用细节

    ES6的解构说白了就是能够让我们一次性取到多个值,大致可分为一下几个方面 1.数组解构 普通的一维数组解构,如下one = array[0],two=array[1],three=array[2] v ...

  3. javascript ES6 新特性之 扩展运算符 三个点 ...

    对于 ES6 新特性中的 ... 可以简单的理解为下面一句话就可以了: 对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中. 作用类似于 Object.assign() ...

  4. JavaScript ES6新特性介绍

    介绍 ES6:ECMScript6 首先,一个常见的问题是,ECMAScript 和 JavaScript 到底是什么关系? ECMAScript是一个国际通过的标准化脚本语言: JavaScript ...

  5. js--ES6新特性之解构

    前言 es6 中引入了解构这一新特性,了解解构成为一个格合前端必须掌握的基础知识,不仅作为了面试的重要考查知识,同时能极大提高我们平常工作的开发效率.本文来总结一下需要掌握的解构知识点. 正文 1.什 ...

  6. ECMAscript6新特性之解构赋值

    在以前,我们要对变量赋值,只能直接指定值.比如:var a = 1;var b = 2;但是发现这种写法写起来有点麻烦,一点都不简洁,而在ECMAScript6中引入了一种新的概念,那就是" ...

  7. ECMA Script 6新特性之解构赋值

    1.基本概念用法 1.1解构赋值:ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值. var a = 1; var b = 2; var c = 3; /*上述赋值语句用解构赋值为*/ v ...

  8. javascript ES6 新特性之 let

    let的作用是声明变量,和var差不多. let是ES6提出的,在了解let之前,最好先熟悉var的原理. JavaScript有一个机制叫“预解析”,也可以叫“提升(Hoisting)机制”.很多刚 ...

  9. javascript ES6 新特性之 Promise,ES7 async / await

    es6 一经推出,Promise 就一直被大家所关注.那么,为什么 Promise 会被大家这样关注呢?答案很简单,Promise 优化了回调函数的用法,让原本需要纵向一层一层嵌套的回调函数实现了横向 ...

随机推荐

  1. NodeJS4-4静态资源服务器实战_优化引入模板引擎

    引入模板引擎(handlebars) cnpm i handlebars 结构大概是这样子的,新建模板dir.tpl文件和route.js dir.tpl <!DOCTYPE html> ...

  2. LeetCode529. 扫雷游戏 Python3 DFS+BFS+注释

    https://leetcode-cn.com/problems/minesweeper/solution/python3-dfsbfszhu-shi-by-xxd630/ 规则: 'M' 代表一个未 ...

  3. KVM虚拟机快照备份

    KVM 快照的定义:快照就是将虚机在某一个时间点上的磁盘.内存和设备状态保存一下,以备将来之用.它包括以下几类: (1)磁盘快照:磁盘的内容(可能是虚机的全部磁盘或者部分磁盘)在某个时间点上被保存,然 ...

  4. 01-EF Core笔记之创建模型

    使用EF Core的第一步是创建数据模型,模型建的好,下班走的早.EF Core本身已经设置了一系列约定来帮我们快速的创建模型,例如表名.主键字段等,毕竟约定大于配置嘛.如果你想改变默认值,很简单,E ...

  5. 阿里云服务器部署Tornado应用

    本篇详细介绍tornado应用部署到阿里云服务器上的全过程. Tornado程序地址:github https://github.com/ddong8/ihasy.git 准备工作:阿里云服务器Cen ...

  6. 从AlexNet(2012)开始

    目录 写在前面 网络结构 创新点 其他有意思的点 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在前面 本文重点在于回顾深度神经网络在CV领域的First Blood--A ...

  7. netcore 创建腾讯云私有镜像 发布到docker 实战

    上一篇博客写的 netcoer上传到docker ,编译 并发布,传送门:FineUICore基础版部署到docker实战 这是一种笨方法,理想的方法是,在本地编译成镜像,然后推送到镜像仓库,服务器的 ...

  8. Axure5.1.0.1699 RP汉化版

    Axure是一款产品原型(Prototype)设计软件,可通过这个软件编辑一些常见的事件和在特点条件下才会触发的情况,可以快速的生成HTML Demo页面. 使用Axure的用户很多,据淘宝UED消息 ...

  9. linux 系统账户 和 普通账户 的区别

    最近使用 useradd -r 选项进行创建账户,用于测试,对-r 选项不是很明白,下面记录一些调研的过程: -r, --system Create a system account. System ...

  10. Redis学习二(数据操作).

    key 操作 删除 key:del key 批量删除key:redis-cli -a(密码)keys "QXJ_*"| xargs redis-cli -a(密码)del 查看所有 ...