ES6知识点总结二:解构赋值

2023-11-16

3、解构赋值

ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构

数组

const courseArr = ['es6','es7','es8'];
const a=courseArr[0];
const b=courseArr[1];
const c=courseArr[2];
console.log('传统赋值:',a,b,c);
function getArr(){
    const [a,b,c] = courseArr;
    const [d,,f] = courseArr;
    console.log('解构赋值:',a,b,c);
    console.log('解构赋值:',d,f);
}
getArr();
let [foo, [[bar], baz]] = [1, [[2], 3]];
console.log(foo,bar,baz);//1,2,3
let [ , , third] = ["foo", "bar", "baz"];
console.log(third);//baz
let [head, ...tail] = [1, 2, 3, 4];
console.log(tail);//[2,3,4]
let [x, y, ...z] = ['a'];
x // "a"
y // undefined
z // []
//如果解构不成功,变量的值就等于undefined

如果等号的右边不是数组(或者严格地说,不是可遍历的结构),那么将会报错

let [foo] = 1;
let [foo] = false;
let [foo] = NaN;
let [foo] = undefined;
let [foo] = null;
let [foo] = {};

对象

//获取对象的值,以往的写法
const course = {
name:'es6',
price:500
};
//传统赋值
const name = course.name;
const price = course.price;
console.log('name :', name);
console.log('price :', price);
//结构赋值获取name、price的值,解构赋值左右两边数据必须保持一样
function getName(){
    const {name,price} = course;
    console.log('name :', name);
    console.log('price :', price);
}
getName();
//由于const不允许重复声明,为了互不影响,将解构赋值例子放入函数中,因为const有块级作用域

复杂类型

const other = {
    name1:'es6',
    price:500,
    teacher:{
        name:'jingjing',
        age:30
    }
}
const {name1,teacher:{name}} = other;
console.log(name1,name);
//遇到有两个name值时,下面这种写法会报错,是因为const不允许重复声明
const other = {
    name:'es6',
    price:500,
    teacher:{
        name:'jingjing',
        age:30
    }
}
//const {name,teacher:{name}} = other;//报错:Identifier 'name' has already been declared
//为了解决这种报错,可以为name改名
const {name:otherName,teacher:{name}} = other;
 console.log(otherName,name);

默认值

默认值生效的条件是,对象的属性值严格等于undefined
ES6 内部使用严格相等运算符(===),判断一个位置是否有值。所以,只有当一个数组成员严格等于undefined,默认值才会生效

let [x = 1] = [undefined];
x // 1
let [x=1] = []
x //1
let [x = 1] = [null];
x // null

//如果一个数组成员是null,默认值就不会生效,因为null不严格等于undefined
null==undefined; //true
null===undefined; //false

注意点

// 错误的写法
let x;
{x} = {x: 1};
// SyntaxError: syntax error

上面代码的写法会报错,因为 JavaScript 引擎会将{x}理解成一个代码块,从而发生语法错误。只有不将大括号写在行首,避免 JavaScript 将其解释为代码块,才能解决这个问题。

// 正确的写法
let x;
({x} = {x: 1});

函数的结构赋值

function add([x, y]){
  return x + y;
}
add([1, 2]); // 3

用途

交换变量

let x = 1;
let y = 2;
[x, y] = [y, x];
x;//2
y;//1

获取函数返回的多个值

//数组
function example() {
  return [1, 2, 3];
}
let [a, b, c] = example();
a;//1
b;//2
c;//3

//对象
function example() {
  return {
    foo: 1,
    bar: 2
  };
}
let { foo, bar } = example();

获取JSON数据值

//JSON常用于前后端数据交换,JSON属于字符串,以往获取JSON中数据,需要使用json.parse()转换为对象
const jsonData = '{"id": 42, "status": "OK", "data": [867, 5309], "isTeacher": true}';
const {id,status} = JSON.parse(jsonData);
console.log(id,status);

参考:https://www.w3cschool.cn/escript6/escript6-s4pc37et.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ES6知识点总结二:解构赋值 的相关文章

  • 使用referrer javascript从google获取查询参数

    是否可以从google搜索中获取查询参数 IE 如果有人用谷歌搜索自行车 网址就会变成 https www google es search q bicycles 如果您随后进入搜索结果并且有人点击您的页面 您将无法看到带有 documen
  • 如何在 Nodejs - mongodb 搜索中对结果进行排序,但是,通过调用动态方法

    我正在 Nodejs 中开发一个 Web 应用程序 通过 mongo 本机连接器连接到 mongodb 在我的一个 js 文件中 我有一个通用方法来调用 find 或 findOne 操作以从 mongodb 集合中检索我需要的任何内容 如
  • 将nodejs Express静态请求重定向到https

    我需要将所有 http 请求重定向到 https 包括对静态文件的请求 My code app use express static dirname public app get function req res if req secure
  • toastr (jquery) 只能显示一次

    你能帮我限制烤面包机的外观吗 给定的情况是 当我登录系统时 欢迎 toastr 只会在主屏幕上出现一次 并且在整个会话中不会再次出现 直到我注销为止 这是我的 toastr 代码 setTimeout function toastr opt
  • YouTube 360​​ 视频 iframe 无法在移动浏览器中工作

    我正在尝试为 YouTube 360 视频获取嵌入的 iframe 以便在我的移动网站上播放 它在桌面浏览器上运行良好 但在移动浏览器中我只能播放平面立体视图 我可以确认它绝对是一个 HTML5 播放器 这显然是其他人正在经历的一个未解决的
  • 计算div中有多少个元素

    我有一个div 里面有span 有没有一种方法可以计算 div 中有多少个元素 然后将其作为值给出 例如 一个 div 中有 5 个跨度 那么它会对其进行计数并发出警报 5 请使用 JavaScript 谢谢 如果你想要后代的数量 你可以使
  • 当 img.crossOrigin="Anonymous" 时,Chrome MJPEG CORS“响应无效”

    Image from origin http 192 168 1 67 5555 has been blocked from loading by Cross Origin Resource Sharing policy Invalid r
  • 使用 lambda 更新 amazon s3 对象元数据而不执行对象复制?

    是否可以使用 lambda 函数添 加或更新 s3 对象元数据而不复制对象 这篇 2 年前的帖子说我们确实需要复制一份 https stackoverflow com questions 32646646 how do i update m
  • 在 JSON 数组中按属性查找对象

    我在获取 JSON 数据中的字符串时遇到问题 格式如下 name Alice age 20 id David last 25 id John last 30 有时它会一起改变位置 John从第三名到第二名 name Alice age 20
  • 如何使用 RSpec 测试 javascript 重定向?

    我正在使用 xhr post 与控制器交互 并且我期待重定向 在 js erb 中 我有 window location href address 手动测试 浏览器会正确重定向 我如何使用 RSpec 测试它 response should
  • 我如何使用 ngRedux 测试服务

    我如何用 karma jasmine 模拟 ngRedux 的 getState 例如 我的服务通过 ngRedux 从商店获取价值 this ngRedux getState 我通过监视 getState 方法解决了这个问题 spyOn
  • .then(functionReference) 和 .then(function(value){return functionReference(value)}) 之间有区别吗?

    给定一个用于处理的命名函数Promise value function handlePromise data do stuff with data return data a 传递命名函数handlePromise作为参考 then pro
  • React-Router v5 History.push 不触发组件

    很抱歉朋友们又问这个问题了 我找到了解决这个问题的几个方法 但他们让我很困惑 我只是想问一个优雅的方法来做到这一点 正如你通过标题所理解的 我有一个关于反应路由的问题 让我解释 我有一个按钮 其名称是Login 单击按钮后 我执行了一些逻辑
  • 使用 ngx-translate 时更改 URL

    当有人使用 ngx translate 单击所选语言时 我尝试更改 URL 我想我应该通过订阅语言更改事件然后修改当前的 url 以反映所选的语言来做到这一点 因为我是新手 所以我不确定是否需要服务来做到这一点 或者可能是另一种解决方法 我
  • javascript 多维类型数组 (Int8Array) 示例

    我尝试使用类型数组而不是数组来减少内存 function createarrayInt8 numrows numcols number var arr new Int8Array numrows for var i 0 i lt numro
  • 如何设置第三方 cookie

    我如何设置第三方 cookie 我有要求设置cookie 并且cookie将在访问的网站中启用 就像我在访问cde com或def com或ghi com时在abc com中设置cookie一样 所以设置的cookie将在所有网站上获取 我
  • 添加元数据到快速路线

    有什么方法可以将元数据添加到 Express 的路线中吗 例如 app get some route function req res some meta data 我正在寻找一种针对我的节点应用程序的 AOP 方法 因此我想通过身份验证和
  • 通过排列四个给定数字找到最大可能时间 HH:MM

    我最近为了工作晋升而参加了编码测试 这是我真正遇到的任务之一 我想知道什么是最好的方法来做到这一点 我使用了大量的 if 和 if else 这不是最干净的解决方案 但完成了工作 我被问到的问题是 将 4 个数字格式化为 24 小时时间 0
  • 对于调用另一个异步函数的异步函数,玩笑测试失败

    我正在尝试测试一个使用另一个异步函数返回的数据的异步函数 这是解释我的问题的代码 StudentInfo js export async function getData studentData imported from another
  • 为什么转换 new.Date() .toISOString() 会改变时间?

    我正在以两种不同的格式在数据库中插入日期 这是作为日期时间插入 var mydate mydate new Date document getElementById clockinhour value mydate toISOString

随机推荐

  • 不愧是美团内部 “接口自动化测试学习笔记” 这细节讲解,神了

    Lego 美团接口自动化测试实践 1 1接口自动化概述 众所周知 接口自动化测试有着如下特点 1 低投入 高产出 2 比较容 实现自动化 3 和UI自动化测试相比 加稳定 如何做好一个接口自动化测试项目呢 我认为 一个 好的 自动化测试项目
  • Android 13 网络 Adb相关流程深入分析研究

    Android 13 网络 Adb 分析研究 文章目录 Android 13 网络 Adb 分析研究 一 前言 二 默认adb 代码实现 关键 1 修改的目录 2 具体修改 1 在XXX device mk 添加属性 2 设置固定端口号 3
  • 高并发场景下缓存+数据库双写不一致问题分析和解决方案设计

    一 业务场景 库存系统 库存可能会修改 每次修改都要去更新这个缓存 redis 数据 每次库存的数据在缓存中一旦过期 或者是被清理掉了 前端的nginx服务都会发送请求给库存服务 去获取相应的数据 实际上的处理流程没有这么的简单 这里 其实
  • mysql 语句优化的十个经验

    mysql 语句优化的十个经验mysql 语句优化的十个经验 本文算是前一篇 查询语句优化经验总结1的后续 总结了 lt 高性能mysql gt 中与网上常见的一些优化经验中出现的案例进行总结与勘误 但是要注意本文中出现的explain结论
  • anaconda常用命令大全(保姆级别建议收藏)

    一 创建虚拟环境 conda create name env name conda create name env name python 3 6 创建指定python版本 conda create name env name python
  • jmeter分布式压测 linux

    主机master修改 jmeter properties server rmi ssl disable true server port 1099 remote hosts 192 168 36 131 1099 slave分机的ip地址
  • 【python】numpy的array数组与pandas的DataFrame表格互相转换(图文代码超详细)

    目录 0 环境 1 array数组和DataFrame表格的简单介绍 2 转换方式详解 代码 0 前提 需注意 1 array转化为DataFrame 2 DataFrame转化为array 3 完整代码 0 环境 windows jupy
  • WAMP环境隐藏PHP文件实际路径和后缀名

    有时候做客户端开发阶段得测试 需要一个模拟服务器的环境 我使用得最顺手得还是WAMP环境 后台给出的api接口的路径千奇百怪 在WAMP环境中如何模拟这些路径呢 如何将某个路径下的PHP文件映射到另一个URL路径下并隐藏PHP文件后缀呢 在
  • MySQL数据库安装实践 Part 1:单实例部署

    1 MySQL的安装方法介绍 当今的互联网企业中 MySQL数据库大多运行在linux系列操作系统 若应用场景不同 版本不同 MySQL数据库的安装方法也会有区别 下面把常见的几种方法介绍给朋友们 1 1 yum rpm方式安装 MySQL
  • 【zookeeper】raft 共识算法 动画演示 网站

    1 概述 地址 https cyberdak github io thesecretlivesofdatacn raft
  • 中国计算机大会CNCC技术论坛

    第十五届中国计算机大会 CNCC2018 将于 2018 年 10 月 25 27 日在杭州国际博览中心举行 本届大会以 大数据推动数字经济 Big Data Drives the Digital Economy 为主题 探讨计算技术领域最
  • Java-String类的常用方法

    Java String类的常用方法 1 常用方法1 int length 返回字符串的长度 return value length char charAt int index 返回某索引处的字符return value index bool
  • 数据库表字段命名规范

    本文是一篇包含了数据库命名 数据库表命名 数据库表字段命名及SQL语言编码的规范文档 针对研发中易产生的问题和常见错误做了一个整理和修改 为日后涉及到数据库相关的研发工作做好准备 一 数据库命名规范 采用26个英文字母 区分大小写 和0 9
  • 有关深度学习的文章

    https zybuluo com hanbingtao note 485480 https tigerneil gitbooks io neural networks and deep learning zh content chapte
  • OrCAD原理图绘制使用操作

    文章目录 工程的创建 原理图整体设置 调用元器件库 常用元器件库调用 key 一些元器件库介绍 key 常用元器件搜索名 自建元器件库 新建元器件库 新建元器件 绘制元器件管脚设置 key Homogeneous和Heterogeneous
  • 数据结构-树

    目录 树 知识框架 一 树的基本概念 1 树的定义 2 基本术语 3 树的性质 二叉树 一 二叉树的概念 1 二叉树的定义 2 特殊的二叉树 3 二叉树的一些性质 4 二叉树的存储结构 1 顺序存储 2 链式存储 二 二叉树的创建和遍历 1
  • 关于 VTK 7.1.0 + python3.X 的 pycharm 开发环境的搭建

    在此记录一下关于关于 VTK 7 1 0 python3 X 的 pycharm 开发环境的搭建中碰到的问题 一 什么是 VTK 以及支持 python 的版本 VTK visualization toolkit 是一个开源的免费软件系统
  • php7.4安装

    php7 4安装 下载安装编译工具 yum groupinstall Development Tools y 安装依赖包 yum y install libxml2 libxml2 devel openssl openssl devel b
  • Spring Security详解

    Spring Security详解 一 系统安全 二 Spring Security简介 三 案例 1 新建模块 2 导入静态资源 3 编写控制器 实现跳转 4 安全功能实现 认证和授权 权限控制和注销 记住我 一 系统安全 在Web开发中
  • ES6知识点总结二:解构赋值

    3 解构赋值 ES6 允许按照一定模式 从数组和对象中提取值 对变量进行赋值 这被称为解构 数组 const courseArr es6 es7 es8 const a courseArr 0 const b courseArr 1 con