ECMAScript6介绍及环境搭建

news2024/11/24 8:54:46

这实际上说明,对象的解构赋值是下面形式的简写。

let { foo: foo, bar: bar } = { foo: ‘aaa’, bar: ‘bbb’ };

也就是说,对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。

let { foo: baz } = { foo: ‘aaa’, bar: ‘bbb’ };

baz // “aaa”

foo // error: foo is not defined

上面代码中,foo是匹配的模式,baz才是变量。真正被赋值的是变量baz,而不是模式foo。

(2)嵌套对象的解构赋值

与数组一样,解构也可以用于嵌套结构的对象。

let obj = {

p: [

‘Hello’,

{ y: ‘World’ }

]

};

let { p: [x, { y }] } = obj;

x // “Hello”

y // “World”

注意,这时p是模式,不是变量,因此不会被赋值。如果p也要作为变量赋值,可以写成下面这样。

let obj = {

p: [

‘Hello’,

{ y: ‘World’ }

]

};

let { p, p: [x, { y }] } = obj;

x // “Hello”

y // “World”

p // [“Hello”, {y: “World”}]

下面是另一个例子。

4.5、解构赋值注意事项

(1)如果要将一个已经声明的变量用于解构赋值,必须非常小心。

// 错误的写法

let x;

{x} = {x: 1};

// SyntaxError: syntax error

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

// 正确的写法

let x;

({x} = {x: 1});

上面代码将整个解构赋值语句,放在一个圆括号里面,就可以正确执行。关于圆括号与解构赋值的关系,参见下文。

(2)解构赋值允许等号左边的模式之中,不放置任何变量名。因此,可以写出非常古怪的赋值表达式。

({} = [true, false]);

({} = ‘abc’);

({} = []);

上面的表达式虽然毫无意义,但是语法是合法的,可以执行。

(3)由于数组本质是特殊的对象,因此可以对数组进行对象属性的解构。

let arr = [1, 2, 3];

let {0 : first, [arr.length - 1] : last} = arr;

first // 1

last // 3

上面代码对数组进行对象解构。数组arr的0键对应的值是1,[arr.length - 1]就是2键,对应的值是3。方括号这种写法,属于“属性名表达式”。

4.6、解构赋值的用途

变量的解构赋值用途很多。

(1)交换变量的值

let x = 1;

let y = 2;

[x, y] = [y, x];

上面代码交换变量x和y的值,这样的写法不仅简洁,而且易读,语义非常清晰。

(2)从函数返回多个值

函数只能返回一个值,如果要返回多个值,只能将它们放在数组或对象里返回。有了解构赋值,取出这些值就非常方便。

// 返回一个数组

function example() {

return [1, 2, 3];

}

let [a, b, c] = example();

// 返回一个对象

function example() {

return {

foo: 1,

bar: 2

};

}

let { foo, bar } = example();

(3)函数参数的定义

解构赋值可以方便地将一组参数与变量名对应起来。

// 参数是一组有次序的值

function f([x, y, z]) { … }

f([1, 2, 3]);

// 参数是一组无次序的值

function f({x, y, z}) { … }

f({z: 3, y: 2, x: 1});

(4)提取JSON数据

解构赋值对提取 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]

上面代码可以快速提取 JSON 数据的值。

(5)函数参数的默认值

jQuery.ajax = function (url, {

async = true,

beforeSend = function () {},

cache = true,

complete = function () {},

crossDomain = false,

global = true,

// … more config

} = {}) {

// … do stuff

};

指定参数的默认值,就避免了在函数体内部再写var foo = config.foo || ‘default foo’;这样的语句。

(6)遍历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) {

// …

}

(7)输入模块的指定方法

加载模块时,往往需要指定输入哪些方法。解构赋值使得输入语句非常清晰。

const { SourceMapConsumer, SourceNode } = require(“source-map”);

5、字符串、函数、数组、对象的扩展


5.1、模板字符串

传统的 JavaScript 语言,输出模板通常是这样写的(下面使用了 jQuery 的方法)。

$(‘#result’).append(

‘There are ’ + basket.count + ' ’ +

'items in your basket, ’ +

’ + basket.onSale +

‘ are on sale!’

);

上面这种写法相当繁琐不方便,ES6 引入了模板字符串解决这个问题。

$(‘#result’).append(`

There are ${basket.count} items

in your basket, ${basket.onSale}

are on sale!

`);

模板字符串(template string)是增强版的字符串,用反引号(`)标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。

// 普通字符串

In JavaScript '\n' is a line-feed.

// 多行字符串

`In JavaScript this is

not legal.`

console.log(`string text line 1

string text line 2`);

// 字符串中嵌入变量

let name = “Bob”, time = “today”;

Hello ${name}, how are you ${time}?

上面代码中的模板字符串,都是用反引号表示。

转义符号

如果在模板字符串中需要使用反引号,则前面要用反斜杠转义。

let greeting = \Yo` World!`;

多行字符串

如果使用模板字符串表示多行字符串,所有的空格和缩进都会被保留在输出之中。

$(‘#list’).html(`

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1871227.html

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

    相关文章

    基于sivaco设计仿真PT型IGBT和NPT型IGBT结构

    本项目基于使用仿真软件SIVACO来仿真研究PT型和NPT型的IGBT结构特点,并且通过仿真研究对于不同的掺杂浓度、沟道宽度等对器件的特性产生不同的影响。 资料获取到咸🐟:xy591215295250 \\\或者联系wechat 号:comprehensivable &…

    IND83081芯片介绍(二)

    七、典型应用 上面显示了独立的CAN收发器,而下面则显示了多个iND83081可以共享同一个CAN收发器的应用场景。通过这些连接,iND83081可以实现对多个LED的驱动和控制,同时与外部MCU进行通信 。 八、ELINS接口 1.ELINS简介 ELINS是一种从接口&a…

    PHP 网络通信底层原理分析

    大家好,我是码农先森。 引言 我们日常的程序开发大多数都是以业务为主,很少会接触到底层逻辑。对于我们程序员来说,了解程序的底层运行逻辑,更有助于提升我们对程序的理解。我相信大多数的人,每天基本上都是完成业务…

    利用labelme制作自己的coco数据集(labelme转coco数据集)

    最近刚接触学习mmdetection,需要用到coco格式的数据集。 1.安装labelme 建议在conda(base)环境下安装(前提是需要下载anaconda),下面是我已经装过的情况。 2.进入labelme环境下 中间可能会提示安装其它库,自行装上就行。 这里的…

    5种u盘加密技巧分享,保护保护您的数据隐私

    怎么给电脑U盘加密呢?U盘作为一种便携式存储设备,常常用于传输和存储敏感信息。由于U盘的易于丢失或被盗的特点,U盘加密显得尤为重要。今天教大家如何给电脑U盘加密,推荐3款优秀的U盘加密软件,并提供操作方法和注意事项…

    51单片机看门狗定时器配置

    测试环境 单片机型号:STC8G1K08-38I-TSSOP20,其他型号请自行测试; IDE:KEIL C51; 寄存器配置及主要代码 手册中关于看门狗的寄存器描述如下: 启动看门狗,需将B5位EN_WDT置1即可,…

    数据结构与算法基础(王卓)--学习笔记

    1 数据结构分类 1.1 逻辑结构分类 集合结构线性结构:线性表、栈、队列、串树形结构图形结构 1.2 物理结构分类 逻辑结构在计算机中的真正表示方式(又称为映射)称为物理结构,也可叫做存储结构 顺序存储结构:数组链…

    嵌入式学习——数据结构(双向无头有环链表、内核链表、栈)——day48

    1. 约瑟夫环问题——双向无头回环链表 1.1 问题描述 给定 ( n ) 个人(编号为 ( 1, 2, \ldots, n )),他们围成一个圈。从第一个人开始报数,每报到第 ( k ) 个人时,杀掉这个人,然后从下一个人重新开始报数。…

    一些硬件知识(十二)

    1、请说明一下滤波磁珠和滤波电感的区别。 因此磁珠通常用于模数地的连接。 磁珠由导线穿过铁氧体组成,直流电阻很小,在低频时阻抗也很小,对直流信号几乎没有影响。 在高频(几十兆赫兹以上)时磁珠阻抗比较大&#xff0…

    事务处理概述

    一、引言 1、决定数据库应用系统性能的DBMS的关键实现技术——事务处理技术 事务处理技术是为了解决早期的DBMS产品在应用过程中遇到的现实问题而在后续的DBMS产品中加以实现的技术 2、比如在银行系统中,账户转账是常见的业务,是金融学中的交易trans…

    【MLP-BEV(7)】深度的计算。针孔相机和鱼眼相机对于深度depth的采样一个是均匀采样,一个是最大深度均匀采样

    文章目录 1.1 问题提出1.1 看看DD3D 的深度是怎么处理的给出代码示例 1.2 我们看看BEVDepth的代码 1.1 问题提出 针孔相机和鱼眼相机的投影模型和畸变模型不一样,如果对鱼眼的模型不太了解可以到我的这篇博客【鱼眼镜头11】Kannala-Brandt模型和Scaramuzza多项式模…

    go语言day4 引入第三方依赖 整型和字符串转换 进制间转换 指针类型 浮点数类型 字符串类型

    Golang依赖下载安装失败解决方法_安装go依赖超时怎么解决-CSDN博客 go安装依赖包(go get, go module)_go 安装依赖-CSDN博客 目录 go语言项目中如何使用第三方依赖:(前两步可以忽略) 一、安装git,安装程序…

    vue启动时的错误

    解决办法一:在vue.config.js中直接添加一行代码 lintOnSave:false 关闭该项目重新运行就可启动 解决办法二: 修改组件名称

    步步精科技诚邀您参加2024慕尼黑上海电子展

    尊敬的客户: 我们诚挚地邀请您参加即将于2024年7月8日至7月10日在上海新国际博览中心举办的2024慕尼黑上海电子展(electronica China)。此次展会汇聚了国内外优秀企业,展示从元器件到系统集成方案的完整产品链,为各行…

    点云处理实战 点云平面拟合

    目录 一、什么是平拟合 二、拟合步骤 三、数学原理 1、平面拟合 2、PCA过程 四、代码 一、什么是平拟合 平面拟合是指在三维空间中找到一个平面,使其尽可能接近给定的点云。最小二乘法是一种常用的拟合方法,通过最小化误差平方和来找到最优的拟合平面。 二、拟合步骤…

    极验行为式验证码适配HarmonyOS 鸿蒙SDK下载

    现阶段,越来越多的开发者正在积极加入鸿蒙生态系统。随着更多开发者的参与,早在去年9月,极验就成为首批拥有鸿蒙NEXT内测版本和手机系统测试机会的验证码供应商。 为了提高各开发者及企业客户集成鸿蒙版本行为验4.0的效率,方便大家…

    放大招了|十亿参数大模型LLMs运行功耗仅需13W,内存使用量减少90%!

    矩阵乘法(MatMul)历来是大型语言模型(LLMs)总体计算成本的主导因素,尤其在模型向更大维度嵌入和上下文长度发展时,这一成本呈指数级增长。 近期有一篇刚刚发表的论文中提出的方法完全去除了矩阵乘法操作&am…

    SS8870T-3.6A 扫地机和滚刷电机的大电流电机驱动

    扫地机器人已经成为现代家庭清洁的必备工具,而其中的关键部件——电机,对于其性能和用户体验起着至关重要的作用。为了确保扫地机器人的高效清洁和稳定运行,至少需要使用7个直流电机,包括行走轮、滚轮、边刷和吸尘等功能的驱动。 …

    2024/5/9【贪心5/5】--代码随想录算法训练营day36|56. 合并区间、738.单调递增的数字、968.监控二叉树 (可跳过)

    56. 合并区间 力扣链接 class Solution:def merge(self, intervals):result []if len(intervals) 0:return result # 区间集合为空直接返回intervals.sort(keylambda x: x[0]) # 按照区间的左边界进行排序result.append(intervals[0]) # 第一个区间可以直接放入结果集中…

    专业软件测试公司分享:安全测评对于软件产品的重要性

    在互联网普及的今天,随着各类软件的大规模使用,安全问题也变得愈发突出。因此,对软件进行全面的安全测评,不仅可以有效保障用户的信息安全,还能提升软件产品的信任度和市场竞争力。 安全测评对于软件产品的重要性就如…