javascript ES6 新特性之 解构

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

原文地址:https://www.cnblogs.com/weijiutao/p/10638325.html

时间: 2024-10-09 14:22:32

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

ES6新特性:解构赋值(上)

1:什么是解构赋值 按照一贯的套路,接下来的内容是解释:什么是解构赋值? 来看看官方的解释: ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 这句话也不难理解,但是前端君怎么会这么敷衍了事,随便贴一段官方的文字解释就算呢. 来,我们来上一段代码进一步解释一下什么叫解构赋值. 关于给变量赋值,传统的变量赋值是这样的: var arr = [1,2,3];//把数组的值分别赋给下面的变量: var a = arr[0]; var b = a

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

对于 ES6 新特性中的 ... 可以简单的理解为下面一句话就可以了: 对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中. 作用类似于 Object.assign() 方法,我们先来看一下 Object.assign() 方法: Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象.它将返回目标对象.如下: const target = { a: 1, b: 2 }; const source = { b: 4, c: 5

ECMAscript6新特性之解构赋值

在以前,我们要对变量赋值,只能直接指定值.比如:var a = 1;var b = 2;但是发现这种写法写起来有点麻烦,一点都不简洁,而在ECMAScript6中引入了一种新的概念,那就是"解构",这种赋值语句极为简洁,比传统的属性访问方法更为清晰.那什么是解构呢?按照一定的模式,允许从数组或者对象中获取到值,并且对其变量进行赋值.称为"解构". 看到上图了吧,解构是不是很简洁.其实解构不单用于数组.对象,只要内部具有iterator接口,就都可以使用解构来给变量赋

ECMA Script 6新特性之解构赋值

1.基本概念用法 1.1解构赋值:ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值. var a = 1; var b = 2; var c = 3; /*上述赋值语句用解构赋值为*/ var [a,b,c] = [1,2,3]; 1.2上述的解构发生在等号左右模式相同的情况下,如果等号两边的模式不一致,解构可能会不成功: /*当变量多于值个数或无值时,解构失败*/ var [foo] = []; var [a,b] = [1]; /*当变量少于值个数,不完全解构*/ let [a,

javascript ES6 新特性之 let

let的作用是声明变量,和var差不多. let是ES6提出的,在了解let之前,最好先熟悉var的原理. JavaScript有一个机制叫“预解析”,也可以叫“提升(Hoisting)机制”.很多刚接触JavaScript的人都会被这个机制弄混.比如: // var 的情况 console.log(a); // 输出undefined var a = 2; 在预编译阶段,JavaScript引擎会将上面的a函数修改成下面的写法: var a; //声明且初始化为undefined consol

JavaScript学习--Item24 ES6新特性概览

ES6新特性概览 本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony(和谐之意,显然没有跟上我国的步伐,我们已经进入中国梦版本了).上一次标准的制订还是2009年出台的ES5.目前ES6的标准化工作正在进行中,预计会在14年12月份放出正式敲定的版本.但大部分标准已经就绪,且各浏览器对ES6的支持也正在实现中.要查看ES6的支持情况请点此. 目前想要

ES6新特性三: Generator(生成器)函数详解

本文实例讲述了ES6新特性三: Generator(生成器)函数.分享给大家供大家参考,具体如下: 1. 简介 ① 理解:可以把它理解成一个函数的内部状态的遍历器,每调用一次,函数的内部状态发生一次改变. ② 写法: function* f() {} ③ 作用:就是可以完全控制函数的内部状态的变化,依次遍历这些状态. ④ 运行过程:当调用Generator函数的时候,该函数并不执行,而是返回一个遍历器(可以理解成暂停执行).通过调用next()开始执行,遇到yield停止执行,返回一个value

ES6新特性

ES6新特性概览 箭头操作符 如果你会C#或者Java,你肯定知道lambda表达式,ES6中新增的箭头操作符=>便有异曲同工之妙.它简化了函数的书写.操作符左边为输入的参数,而右边则是进行的操作以及返回的值Inputs=>outputs. 我们知道在JS中回调是经常的事,而一般回调又以匿名函数的形式出现,每次都需要写一个function,甚是繁琐.当引入箭头操作符后可以方便地写回调了.请看下面的例子. var array = [1, 2, 3]; //传统写法 array.forEach(f

ES6新特性概述

http://es6.ruanyifeng.com/#README https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference (1)箭头操作符 如果你会C#或者Java,你肯定知道lambda表达式,ES6中新增的箭头操作符=>便有异曲同工之妙.它简化了函数的书写.操作符左边为输入的参数,而右边则是进行的操作以及返回的值Inputs=>outputs.我们知道在JS中回调是经常的事,而一般回调又以匿名函数的形式出现,每次