JavaScript解构赋值
JavaScript解构赋值
JavaScript解构赋值为我们提供了很多方便,但是用法比较多,本文就来梳理一下。总体来说,主要就两种地方使用解构赋值,一种是数组的解构赋值,另一种是对象的解构赋值。以这两个为基础就可以得到比较复杂的解构赋值,本质上就是这些结构的嵌套。
先来看数组的解构赋值:
const arr = ["little", "moon", 1, 2, 3];
const [first, second, ...rest] = arr;
console.log(first, second); // little moon
console.log(rest); //[1, 2, 3]
first、second和rest只是变量名,...rest叫做剩余表达式,将所有剩余下来的放到rest里。数组的解构按顺序将数组赋值给解构表达式左边的变量,左边的变量如果少于数组元素,不会报错,而是有几个赋值几个,比如下面的写法依然可以获取数组前两个元素的值:
const arr = ["little", "moon", 1, 2, 3];
const [first, second] = arr;
如果想忽略某个(些)元素也可以,使用一个占位符,或者直接省略占位符也可以:
const arr = ["little", "moon", 1, 2, 3];
// 忽略不感兴趣的元素
const [, _, one, two, three] = arr;
console.log(one, two, three);
可以利用解构赋值简洁地实现变量交换:
let a = 1;
let b = 2;
[a, b] = [b, a];
console.log("a:" + a + ", b:" + b); // a:2, b:1
下面来看对象的解构,最基础的用法是使用和属性相同的名字,就可以解构到属性值,如下所示:
// 解构对象
const person = {
name: "xiaoyuhang",
age: 22,
address: {
home: "nanjing",
work: "shanghai",
school: {
middleschool: "sy",
highschool: "wg",
graduateschool: "sh"
}
}
}
const {name, age} = person; // 获取到xiaoyuhang 和 22两个属性值
对于这种相对来说层次较多的对象,可以解构到我们想要的层次,下面的例子中,只获取highschool这个属性:
// 可以只解构我们想要的部分,解构到想要的层次
const { address: { school: { highschool } } } = person;
有时候觉得对象属性的命名不太直观,可以在获取的同时为它重命名,使用name: alias这种方式即可,如下所示,将highschool重命名为high_school_address:
const { address: { school: { highschool: high_school_address } } } = person;
有些时候,我们用于获取的属性名不是硬编码到程序中的,而是通过字符串计算得到,这时候就要使用[property]方法来计算属性名,看下面的例子就明白了:
// 计算属性名
const obj1 = { zz: "2020", yy: "2021" }
const z = "zz";
const { [z]: year } = obj1;
console.log(z); // zz
console.log(year); // 2020
此外,通过提供有效的代替名,也可以计算出属性:
const { "yy": nextyear } = obj1;
// const { "yyy": nextyear } = obj1; // 这就不行了 必须要和属性同名的字符串
使用解构,可以方便的在循环中进行赋值:
// 解构 + 迭代
var people = [
{
name: 'Mike Smith',
family: {
mother: 'Jane Smith',
father: 'Harry Smith',
sister: 'Samantha Smith'
},
age: 35
},
{
name: 'Tom Jones',
family: {
mother: 'Norah Jones',
father: 'Richard Jones',
brother: 'Howard Jones'
},
age: 25
}
];
for (var { name: n, family: { father: f } } of people) {
console.log('Name: ' + n + ', Father: ' + f);
}
// Name: Mike Smith, Father: Harry Smith
// Name: Tom Jones, Father: Richard Jones
解构对象,会依次查看原型链上的所有属性,直到找到为止或最终查找失败:
// 解构对象会访问原型链
function Person() {
this.name = "yhx";
this.age = 18;
}
Person.prototype.foo = "bar";
const ps1 = new Person();
const { name, age, foo } = ps1;
console.log(name, age, foo);
ps1对象的原型是Person,我们在Person的prototype属性上添加了一个foo属性,然后解构ps1对象时,对于foo,会沿着原型链查找到foo。
以上大概就是JavaScript解构表达式中最常用且最重要的内容了。
The end.
JavaScript解构赋值的更多相关文章
- JavaScript学习笔记(八)——变量的作用域与解构赋值
在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...
- JavaScript学习笔记 -- ES6学习(三) 变量的解构赋值
1.解构赋值的定义 在ES6中,允许按照一定模式,从数组和对象中提取值(所谓解构),然后对变量进行赋值. var a = 1; var b = 2; var c = 3; //等价于 var [a, ...
- 变量的解构赋值////////////z
变量的解构赋值 数组的解构赋值 对象的解构赋值 字符串的解构赋值 数值和布尔值的解构赋值 函数参数的解构赋值 圆括号问题 用途 数组的解构赋值 基本用法 ES6允许按照一定模式,从数组和对象中提取值, ...
- ES6解构赋值详解
文章转载自:http://www.zhufengpeixun.cn/article/167 解构赋值(destructuring assignment)语法是一个 Javascript 表达式,这种语 ...
- ES6的变量解构赋值
前 言 ES6 解构赋值: ES6允许按照一定模式从数组和对象中提取值,然后对变量进行赋值,这被称为解构. 1.1 数组的结构赋值 1.1.1基本用法 JS中,为变量赋值直接指定.例如下面代码: ...
- es6学习笔记--解构赋值
昨天学习了es6语法中解构赋值,解构赋值在声明中和函数传参提高了灵活性和便捷性,值得掌握该语法. 概念: ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构. 数组的解构 ...
- ECMAScript 6入门 - 变量的解构赋值
定义 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 解构赋值不仅适用于var命令,也适用于let和const命令. 解构赋值的规则是,只要 ...
- ECMAScript 6之变量的解构赋值
1,数组的解构赋值 基本用法 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前,为变量赋值,只能直接指定值. var a = 1; va ...
- es2015 解构赋值
解构赋值语法是一个 Javascript 表达式,这使得可以将值从数组或属性从对象提取到不同的变量中.
随机推荐
- 一言不合就开始搞JDK源码
Java是一门面向对象的编程语言,那什么是面向对象呢,下面将是历史上最通俗易懂的解释了,请看下图: 哈哈,解释的够清楚的了吧.闪. 从源码学编程的好处 学Java编程时,最好同时看一些Java的源码 ...
- linux下 shell时间处理
一.hour #获取当前时间年月日时分秒current_create_time=`date +"%Y-%m-%d %H:%M:%S"` echo $current_create_t ...
- Logstash学习之路(二)Elasticsearch导入json数据文件
一.数据从文件导入elasticsearch 1.数据准备: 1.数据文件:test.json 2.索引名称:index 3.数据类型:doc 4.批量操作API:bulk {"index& ...
- spark的thriftservr的高可用
triftserver是基于jdbc的一个spark的服务,可以做web查询,多客户端访问,但是thriftserver没有高可用,服务挂掉后就无法在访问,所有使用注册到zk的方式来实现高可用 一.版 ...
- MariaDB Galera Cluster集群搭建
MariaDB Galera Cluster是什么? Galera Cluster是由第三方公司Codership所研发的一套免费开源的集群高可用方案,实现了数据零丢失,官网地址为http://g ...
- ocelot 中间件的变化
ocelot 中间件的变化 Intro 之前我们使用 ocelot 的时候自定义了一些中间件来实现我们定制化的一些需求,最近博客园上有小伙伴问我怎么使用,他用的版本是 16.0 版本,16.0 和 1 ...
- fatal error C1045: 编译器限制 : 链接规范嵌套太深
前言 我相信你是遇到了同样的问题.通过搜索引擎来到这里的.为了不耽误排查问题的时间,我提前说明一下这篇文章所描述的问题范畴: 我遇到的问题和 c++ 模板相关: 如果我减少传递的参数的话,是有可能避免 ...
- 使用 Admission Webhook 机制实现多集群资源配额控制
1 要解决的问题 集群分配给多个用户使用时,需要使用配额以限制用户的资源使用,包括 CPU 核数.内存大小.GPU 卡数等,以防止资源被某些用户耗尽,造成不公平的资源分配. 大多数情况下,集群原生的 ...
- #2020征文-开发板# 用鸿蒙开发AI应用(一)硬件篇
目录: 前言 开发板简介 产品特色及功能 产品参数 各个主板功能简介 Hi3516DV300 芯片手册 前言鸿蒙2.0的系统刚开源出来,华为志在打造1+8+N万物互联的全场景智慧生活,不仅是国产操作系 ...
- aix5.3安装httpd服务
1.安装gcc(1)从IBM上下载 gcc-4.0.0-1.aix5.3.ppc.rpm gcc-cplusplus-4.0.0-1.aix5.3.ppc.rpm libgcc-4.0.0-1.aix ...