解构的作用是可以快速取得数组或对象当中的元素或属性,而无需使用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. Spring Bean Scope (作用域)

    singleton: 单例模式,针对每个spring容器,只有一个该类的实例被管理,每次调用此实例都是同一个对象被返回,所以适用于无状态bean.默认情况下,singleton作为spring容器中b ...

  2. git 每次提交需要输入密码

    亲测可行(第一种) 原文:git每次提交都要输入密码怎么办 ================COPY=========================== 不少用户反映在使用Git时,经常会遇到需要频 ...

  3. JS正则表达式语法(含ES6)(表格简要总结)

    文章目录 JS正则表达式 1. JS中正则表达式定义 2. 直接量字符 3. 字符类 4. 重复字符 5. 选择,分组和引用 6. 指定匹配位置 7. 修饰符 8. String 方法 9. RegE ...

  4. 比较typeof与instanceof

    相同点: JavaScript中typeof和instanceof常用来判断一个变量是否为空,或者是什么类型的. 不同点: typeof的定义和用法: 返回值是一个字符串,用来说明变量的数据类型. 细 ...

  5. Sql将一列数据拆分为多行显示的两种方法

    原始数据与期望结果有表tb, 如下:id          value----------- -----------1           aa,bb2           aaa,bbb,ccc欲按 ...

  6. mysql-5.7.21-winx64安装教程

    1 . 下载对用的版本信息 地址是:https://dev.mysql.com/downloads/mysql/ 2 . 解压到目录 D:\tools\mysql\mysql-5.7.21-winx6 ...

  7. PLSQL设置查询快捷键

    Tools-->Preferences-->User Interface-->Editor-->AutoReplace 新建文本文件shortcut.txt(名称和路径可以自定 ...

  8. delphi使用Foxit Quick PDF Library读写pdf文本和图片

    简介: Debenu Quick PDF Library(PDF编程开发工具)提供一套全方位的 PDF API 函数,帮助您快速简便地处理 PDF 文件.从文档属性的基本操作到创建您自己的 PDF 查 ...

  9. JavaScript定时器(Timer)

    版权声明:本文为博主原创文章,未经博主允许不得转载.https://www.cnblogs.com/gaoguowen/p/11119088.html 什么是定时器 简单来说就是在一段时间间隔后执行一 ...

  10. 「SAP技术」A项目关联公司间退货STO流程

    [SAP技术]A项目关联公司间退货STO流程 1)创建公司间退货STO单据. 如下图示的公司间退货STO 4500000572, 2),VL10B, 创建交货单. 如下图交货单号:80044918, ...