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解构赋值的更多相关文章

  1. JavaScript学习笔记(八)——变量的作用域与解构赋值

    在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...

  2. JavaScript学习笔记 -- ES6学习(三) 变量的解构赋值

    1.解构赋值的定义 在ES6中,允许按照一定模式,从数组和对象中提取值(所谓解构),然后对变量进行赋值. var a = 1; var b = 2; var c = 3; //等价于 var [a, ...

  3. 变量的解构赋值////////////z

    变量的解构赋值 数组的解构赋值 对象的解构赋值 字符串的解构赋值 数值和布尔值的解构赋值 函数参数的解构赋值 圆括号问题 用途 数组的解构赋值 基本用法 ES6允许按照一定模式,从数组和对象中提取值, ...

  4. ES6解构赋值详解

    文章转载自:http://www.zhufengpeixun.cn/article/167 解构赋值(destructuring assignment)语法是一个 Javascript 表达式,这种语 ...

  5. ES6的变量解构赋值

      前  言 ES6 解构赋值: ES6允许按照一定模式从数组和对象中提取值,然后对变量进行赋值,这被称为解构. 1.1 数组的结构赋值 1.1.1基本用法 JS中,为变量赋值直接指定.例如下面代码: ...

  6. es6学习笔记--解构赋值

    昨天学习了es6语法中解构赋值,解构赋值在声明中和函数传参提高了灵活性和便捷性,值得掌握该语法. 概念: ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构.   数组的解构 ...

  7. ECMAScript 6入门 - 变量的解构赋值

    定义 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 解构赋值不仅适用于var命令,也适用于let和const命令. 解构赋值的规则是,只要 ...

  8. ECMAScript 6之变量的解构赋值

    1,数组的解构赋值 基本用法 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前,为变量赋值,只能直接指定值. var a = 1; va ...

  9. es2015 解构赋值

    解构赋值语法是一个 Javascript 表达式,这使得可以将值从数组或属性从对象提取到不同的变量中.

随机推荐

  1. Inno Step软件安装包制作教程

    Inno setup制作软件安装包教程 1,Inno Setup介绍 Inno Setup 是一个免费的安装制作软件,小巧.简便.精美是其最大特点,支持pascal脚本,能快速制作出标准Windows ...

  2. C#扫盲篇(一):反射机制--情真意切的说

    在一线编码已有多年,积累了不少非常实用的技能,最近的更新会逐步的分享出来,希望能帮助到还有一丢丢喜欢.Net的朋友,当然这些都比较适合入门选手,虽然自己已是个精通抄代码的老猿,但技术造诣仍是渣渣. 犹 ...

  3. DM TDD使用小结

    1.搭建流程 1.1 ss初始化及启动 --->1节点: cd /dm/bin ./dmdssinit path=/dm/data inst=ss1 port=35300 REGION_SIZE ...

  4. Windows下如何玩转火热的go-zero

    作者:阿啄debugIT 前言 go-zero 是一个集成了各种工程实践的 web 和 rpc 框架.通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验. go-zero 包含极简的 API ...

  5. CentOS 6安装Gitlab

    1. 保证CentOS 6能连接网络 . 2.安装依赖: sudo yum install -y curl policycoreutils-python openssh-server cronie s ...

  6. 【JDBC核心】实现 CRUD 操作

    实现 CRUD 操作 操作和访问数据库 数据库连接被用于向数据库服务器发送命令和 SQL 语句,并接受数据库服务器返回的结果.其实一个数据库连接就是一个 Socket 连接. java.sql 包中有 ...

  7. Netty源码解析 -- FastThreadLocal与HashedWheelTimer

    Netty源码分析系列文章已接近尾声,本文再来分析Netty中两个常见组件:FastThreadLoca与HashedWheelTimer. 源码分析基于Netty 4.1.52 FastThread ...

  8. 【Linux】Linux介绍和安装 - 测试题

    第一部分测试题 Linux介绍和安装 测试题 做点练习题,巩固一下咯~ ~ _ 10 个选择题. 1.让我们选择开机时进哪个操作系统的软件叫什么? A. booter B. bootloader C. ...

  9. ECharts图表——封装通用配置

    前言 前段时间在做大屏项目,大量用到echarts图表,大屏对设计规范要求比较高,而大屏项目,经常会因为业务方面的原因.或者是数据方面的原因改动UI设计,所有图表的代码也是三天一小改.五天一大改 因此 ...

  10. Java并发包源码学习系列:JDK1.8的ConcurrentHashMap源码解析

    目录 为什么要使用ConcurrentHashMap? ConcurrentHashMap的结构特点 Java8之前 Java8之后 基本常量 重要成员变量 构造方法 tableSizeFor put ...