详解JS ES6变量的解构赋值
作者:浅笑· 发布时间:2024-04-19 09:51:35
1.什么是解构?
ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。它在语法上比ES5所提供的更加简洁、紧凑、清晰。它不仅能减少你的代码量,还能从根本上改变你的编码方式。
2.数组解构
以前,为变量赋值,我们只能直接指定值,比如
let a = 1;
let b = 2;
let c = 3;
现在可以用数组解构的方式来进行赋值
let [a, b, c] = [1, 2, 3];
console.log(a, b, c); // 1, 2, 3
这是数组解构最基本类型的用法,还可以解构对象数组
// 对象数组解构
let [a, b, c] = [{name: 'jacky'}, {name: 'monkey'}, {name: 'houge'}];
console.log(a, b, c); // {name: 'jacky'}, {name: 'monkey'}, {name: 'houge'}
3.数组模式和赋值模式统一
这条可以理解为等号左边和等号右边的形式要统一,如果不统一解构将失败。
let [a, [b, c], d] = [1, [2, 3], 4];
console.log(a, b, c, d); // 1 2 3 4
// 提取除第二、三个外的所有数值
let [a, , , d] = [1, 2, 3, 4];
console.log(a, d); //1 4
let [a, ...b] = [1, 2, 3, 4];
console.log(a, b); // 1 [2, 3, 4]
let [a, , , ...d] = [1, 2, 3, 4, 5];
console.log(a, d); // 1 [4, 5]
如果解构不成功,变量的值就等于undefined
let [a, b, c] = [2, 3];
console.log(a, b, c); // 2 3 undefined
let [c] = [];
console.log(c); // undefined
如果解构不成功,变量的值就等于undefined
let [a, b, c] = [2, 3];
console.log(a, b, c); // 2 3 undefined
let [c] = [];
console.log(c); // undefined
上述是完全解构的情况,还有一种是不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组,解构依然可以成功。
let [x, y] = [1, 2, 3];
console.log(x, y); // 1 2
let [a, [b], d] = [1, [2, 3], 4];
console.log(a, b, d); // 1 2 4
4.解构的默认值
解构赋值允许指定默认值。
let [a, b=2] = [1];
console.log(a, b); // 1 2
let [a=1, b=2, c, d=13] = [10, 11, 12];
console.log(a, b, c, d); // 10 11 12 13
5.对象的解构赋值
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
// 对象解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而非前者。
let obj = { a: "aaa", b: "bbb" };
let { a: x, b: y } = obj;
console.log(x, y); // aaa bbb
let { a, b } = { a: 'aaa', b: 'bbb' };
console.log(a, b); // aaa bbb
// 不按照顺序
let { b, a } = { a: 'test1', b: 'test2' }
console.log(a, b) // test1 test2
// 嵌套解构
let { obj: { name }} = { obj: { name: 'jacky', age: '22' } }
console.log(name) // jacky
// 稍微复杂的嵌套
let obj = {
p: [
'Hello',
{ y: 'World' }
]
};
let { p: [x, { y }] } = obj;
console.log(x, y); // Hello World
如果变量名与属性名不一致,必须写成下面这样。
var { foo: rename } = { foo: "aaa",bar: "bbb" };
console.log(rename); // aaa
console.log(foo); // Uncaught ReferenceError: foo is not defined
如果在解构之前就定义了变量,这时候再解构会出现问题。下面是错误的代码,编译会报错(因为js引擎会将{a}理解成一个代码块,从而发生语法错误。只有不将大括号写在行首,避免js将其解释成代码块,才能解决这个问题)
let a;
let obj = { a: "aaa" };
{a} = obj; // Uncaught SyntaxError: Unexpected token '='
要解决报错,使程序正常,这时候只要在解构的语句外边加一个圆括号就可以了
let a;
let obj = { a: "aaa" };
( {a} = obj );
console.log(a); // aaa
6.函数参数
函数的参数也可以使用解构赋值。
function add([x, y]){
return x + y;
}
add([1, 2]); // 3
函数参数的解构也可以使用默认值。
function fn(x, y = 7) {
return x + y;
}
console.log(fn(3)); // 10
7.字符串解构
字符串被转换成了一个类似数组的对象。
const [a, b, c, d, e, f] = "hello";
console.log(a); //h
console.log(b); //e
console.log(c); //l
console.log(d); //l
console.log(e); //o
console.log(f); //undefined
8.数值和布尔值的解构赋值
解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。
let {toString: s} = 0;
console.log(s === Number.prototype.toString); // true
let {toString: s} = true;
console.log(s === Boolean.prototype.toString); // true
解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错
let { prop: x } = undefined; // TypeError
let { prop: y } = null; // TypeError
9.解构赋值的应用
1.交换变量的值
通常交换两个变量的方法需要一个额外的临时变量,如下
let a = 1;
let b = 2;
let temp;
temp = a;
a = b;
b = temp;
console.log(a, b); // 2 1
用ES6解构赋值的话,会变得很简洁
let a = 1;
let b = 2;
[a, b] = [b ,a];
console.log(a, b); // 2 1
2.从函数返回多个值
函数只能返回一个值,如果要返回多个值,只能将它们放在数组或对象里返回。有了解构赋值,取出这些值就非常方便。
// 返回一个数组
function example() {
return [1, 2, 3];
}
let [a, b, c] = example();
// 返回一个对象
function example() {
return {
foo: 1,
bar: 2
};
}
let { foo, bar } = example();
3.访问数组中元素
有种场景,比如有一个数组(可能为空)。并且希望访问数组的第一个、第二个或第n个项,但如果该项不存在,则使用指定默认值。
通常会使用数组的length属性来判断
const list = [];
let firstItem = 'hello';
if (list.length > 0) {
firstItem = list[0];
}
console.log(firstItem); // hello
如果用ES6解构赋值来实现上述逻辑
const list = [];
const [firstItem = 'hello'] = list;
console.log(firstItem); // 'hello'
4.提取 JSON数据
let jsonData = {
id: 42,
status: "OK",
data: [867, 5309]
};
let { id, status, data: number } = jsonData;
console.log(id, status, number);
// 42, "OK", [867, 5309]
5.遍历 Map 结构
任何部署了 Iterator 接口的对象,都可以用for...of循环遍历。Map 结构原生支持 Iterator 接口,配合变量的解构赋值,获取键名和键值就非常方便。
const map = new Map();
map.set('first', 'hello');
map.set('second', 'world');
for (let [key, value] of map) {
console.log(key + " is " + value);
}
// first is hello
// second is world
如果只想获取键名,或者只想获取键值,可以写成下面这样。
// 获取键名
for (let [key] of map) {
// ...
}
// 获取键值
for (let [,value] of map) {
// ...
}
来源:https://www.cnblogs.com/qianxiaox/p/14017197.html


猜你喜欢
- 网页制作中是免不了与表格打交道的。表格是网页制作的基础,在网页布局中起着举足轻重的作用,熟练掌握表格的操作,是你制作网页的辅路石,也是你成为
- 前言备受期待的django 2.0已经发布了,最大的一个变化就是不再支持python2.x版本了,这也为我们还在保守使用的2.x的同学们敲响
- 1、ndarray转换成matriximport numpy as npfrom numpy import random,matr_arr=
- 一、若出现404错误,自动跳转到所在目录的首页;二、若当前页本身是目录首页,则自动跳转至上一级目录的默认首页。自定义404页面代码如下:&l
- 本文实例讲述了sogou地图API应用,是非常实用的技巧。分享给大家供大家参考。具体实现方法如下:地图的初始化1、添加引用地图的API文件:
- var long2="1988-0w-07";alert(long2.substring(0,4)+"----
- 经过一轮的项目封闭开发,页面制作的动手能力提高了不少,用AW的话说就是被复杂的东西虐过以后很多问题都变得容易了,的确很有道理。我个人觉得技术
- Seaborn - 绘制多标签的混淆矩阵、召回、精准、F1导入seaborn\matplotlib\scipy\sklearn等包:impo
- 本文所述为C#实现的Oracle数据库操作类,可执行超多常用的Oracle数据库操作,包含了基础数据库连接、关闭连接、输出记录集、执行Sql
- 在本文中,我们将探讨一种简洁的方式,以此来可视化你的MP3音乐收藏。此方法最终的结果将是一个映射你所有歌曲的正六边形网格地图,其中相似的音轨
- 1. ADO.NET 方式连接Mysql数据库 经过在网上查找资料,在.net 上连接mysql 数据库有三种方式: 方法一: 使用Core
- Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。Djang
- 当用户访问一个网站的时候,第一屏的信息展示是非常重要的,很大程度上影响了用户是否决定停留,然而光靠文字大面积的堆积,很难直观而迅速的告诉用户
- 本文实例讲述了mysql show操作。分享给大家供大家参考,具体如下:SHOW CHARACTER SET显示所有可用的字符集SHOW C
- python断言assert语句assert语句的格式是【assert 表达式,返回数据】,当表达式为False时则触发AssertionE
- 本文实例为大家分享了JavaScript实现简易轮播图效果的具体代码,供大家参考,具体内容如下全部代码:<!DOCTYPE html&
- 一、name_scopewith tf.name_scope(name):name_scope: 为了更好地管理变量的命名空间而提出的。比如
- 当训练样本不均匀时,我们可以采用过采样、欠采样、数据增强等手段来避免过拟合。今天遇到一个3d点云数据集合,样本分布极不均匀,正例与负例相差4
- 初学者可以看看。在的img标签有两个属性分别为alt和title,对于很多初学者而言对这两个属性的正确使用都还抱有迷惑,当然这其中一部分原因
- 列名用了中文的缘故,设置pandas的参数即可,代码如下: import pandas as pd #这两个参数的默认设置都是False p