ES6有何新特性?

目录

介绍

let 和 const 

解构

模板字符串

箭头函数

Set

Map

介绍

ES 全称是ECMAScript,它是JavaScript基础构建的一种语言,JavaScript正是建立在ECMAScript语言的基础规范中建立使用的。ES6实际上是一个泛指,泛指ES2015及后续的版本。发展历程可看如下图:

ES6的新特性主要归为四个方面的更新:一、解决原有语法上的一些不足,二、对原有语法进行增强,三、全新的对象、全新的方法、全新的功能,四、全新的数据类型和数据结构。下面挑一些来具体讲一下吧!

let 和 const 

let关键字

let是ES6新增的用于声明变量的关键字,用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。在声明变量之前,该变量是不存在的,这时如果使用到该变量,就会抛出一个错误。

// 只在let命令所在的代码块内有效
{let a = 20
}
console.log(a) // ReferenceError: a is not defined//变量b是不存在的,这时如果用到它,就会抛出一个错误
console.log(b) // 报错ReferenceError
let b = 2

使用let声明变量前,该变量都不可用,也就是大家常说的“暂时性死区”。只要块级作用域内存在let命令,这个区域就不再受外部影响。同时,let还不允许在相同作用域中重复声明。

var a = 123
if (true) {a = 'abc' // ReferenceErrorlet a;
}//let不允许在相同作用域中重复声明
let a = 20
let a = 30
// Uncaught SyntaxError: Identifier 'a' has already been declared

注意:若在相同的作用域,重复声明是不会报错的。在相同的作用域下重复声明才会报错!

const关键字

const声明一个只读常量,一旦声明,常量的值就不能改变。因此,const一旦声明变量,就必须立即初始化,不能留到以后赋值。如果之前用var或let声明过变量,再用const声明同样会报错。

const a = 1
a = 3
// TypeError: Assignment to constant variable.const b;
// SyntaxError: Missing initializer in const declarationvar a = 20
let b = 20
const a = 30
const b = 30
// 都会报错

const实际上保证的并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据,值就保存在变量指向的那个内存地址,因此等同于常量。对于复杂类型的数据,变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的,并不能确保改变量的结构不变。

const foo = {};// 为 foo 添加一个属性,可以成功
foo.prop = 123;
foo.prop // 123// 将 foo 指向另一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only

三者的区别

var、let以及const三者的区别如下:

声明方式变量提升作用域初始值重复定义
var函数级不需要允许
let块级不需要不允许
const块级必需不允许

解构

可以把解构看作是一个具有结构赋值功能的一个语法。解构主要包括两种:数组解构以及数组解构。

数组解构

单独解构:根据数组索引,将数组解构成单独的元素。若你想要获取数组中的每一个数据,数组的单独解构就会很轻松地解决该问题,不需要采取遍历获取比较麻烦的方式。同时也可以获取到自己想要的数组中某一个的元素。

const arr=[10,20,30]
const[x,y,z]=arr
console.log(x,y,z)//10 20 30
//获取某一个元素
const[,,z]=arr
console.log(z)//30

解构时可以给变量设置默认值,数组没有这个元素的话。

const arr = [10, 20, 30]const [, , , defaultVal = '40'] = arr
console.log('设置默认值', defaultVal)//40

剩余解构:用 "...+变量名" 解构剩余参数到新数组,只能用一次。定义一个新的数组,该数组为rest,该数组会获取解构后的arr数组中的剩余参数到自己中,由于存在e,因此占了arr中的第一个数据,剩下的20,30自动到rest数组中。

const arr = [10, 20, 30]
const [e, ...rest] = arr
console.log(rest) //[20, 30]

对象解构

对象的单个或者多个解构。解构之后可以直接获取到name、age以及height对应的值。可以获取其中的某一个或者全部。

const obj = { name: 'N-A', age: 5, height: undefined }
const { name, age } = obj
console.log(name, age) // 'xiaohui', 18

若你不想要对象中原本的变量名,你还可以给解构出来的变量名进行重新命名。

const obj = { name: 'N-A', age: 5, height: undefined }
const { name: objName } = obj
console.log(objName)

同时与数组解构一同,也可以给解构变量设置默认值。

const obj = { name: 'N-A', age: 5, height: undefined }
const { next = 'default' } = obj
console.log(next)

模板字符串

在ES6之前,如果我们要实现字符串和一些动态的变量进行拼接时,会非常的麻烦。而ES6新增了一个模板字符串,具有换行,插值,使用标签函数进行字符串操作等功能。实现方式非常简单,就是使用反义符号``,包裹起来。

//换行
const str = `ECMAScript`
console.log(str)// 插值
const strs = `random: ${Math.random()}`
console.log(strs)

模板字符串还可以用来调用函数,同时传入相应的参数。函数获取到的第一个参数为数组,该数组存放着被模板字符串拆分的字符串组合。后面的参数是接受模板字符串传入的内容。

/*** 字符串模板函数* @param {array} strs 以插值为分隔符组成的字符串数组* @param {string} name 插值的value,有多少个就会传入多少个*/
const tagFunc = (strs, name, gender) => {const [str1, str2, str3] = strsconst genderParsed = gender == '1' ? '男' : '女'// 可以在此做过滤,字符串处理,多语言等操作return str1 + name + str2 + str3 + genderParsed
}// 带标签的模板字符串,
const person = {name: 'xiaohui',gender: 1,
}
// 返回值为标签函数的返回值
const result = tagFunc`my name is ${person.name}.gender is ${person.gender}`
console.log(result) //my name is xiaohui.gender is 男

箭头函数

箭头函数可以简化函数的定义,其相当于匿名函数。箭头函数就是采用箭头=>来定义函数,省去了关键字function。函数的参数在=>的前面,而函数体则在=>的后面。

当箭头函数没有参数,只有一个参数以及多个参数的情况下,其书写方式如下:

// 没有参数
let fn1=()=>{console.log('hello');
}
//函数有一个参数
let fn2=age=>{console.log(age)
}
//函数有多个参数
let fn3=(val1,val2,val3)=>{console.log(val1,val2,val3)
}

如果函数没有参数,则只需要写一个空括号即可,若函数有一个参数,则参数的括号可以省略。若参数有多个,则使用逗号来分隔。

若箭头函数的函数体中只有一条执行语句,则可以省去函数体中的花括号,若返回的是一个对象,则需要在函数体外再加上一个括号。若箭头函数不需要返回值,则加上void关键字。具体如下代码:

// 返回一个变量
let fn1=val=>val;
// 返回一个表达式
let fn2=(val1,val2)=>val1+val2;
//返回对象
let fn3=(name,age)=>({name:name,age:age
})
//不需要返回
let fn4=()=>void doesNotReturn();

箭头函数没有原型prototype,因此箭头函数没有this指向,它会捕获自己定义所处的外层执行环境,并继承其this值。箭头函数的this指向被定义的时候就确定了,之后不会改变。call/apply/bind也无法改变箭头函数的this指向,若想要改变,可以通过改变其继承this的外层函数的this指向来间接地改变。若箭头函数外层没有函数,则其this会指向window全局对象。(在这篇文章就不详细做演示了)

Set

Set是ES6新增的数据结构,类似于数组,但是存储的值都是不重复的,我们一般称为集合。Set本身是一个构造函数,用来生成 Set 数据结构。const s=new Set,其具有常见的方法如下。

add():添加某个值,返回 Set 结构本身。当添加实例中已经存在的元素,set不会继续添加。

delete():删除某个值,返回一个布尔值,表示删除是否成功。

has():返回一个布尔值,判断该值是否为Set的成员。

clear():清除所有成员,没有返回值。

const s = new Set();
// 增加
s.add(1).add(2).add(2); 
console.log(s)//{1,2}
//删除
s.delete(1);
console.log(s)//{2}
//判断
console.log(s.has(2))//true
//清楚
s.clear();
console.log(s)

keys():Set实例的遍历方法,可以用于返回键名的遍历器。

values():返回键值的遍历器。

entries():返回键值对的遍历器。

let set = new Set(['red', 'green', 'blue']);for (let item of set.keys()) {console.log(item);
}
// red
// green
// bluefor (let item of set.values()) {console.log(item);
}
// red
// green
// bluefor (let item of set.entries()) {console.log(item);
}
// ["red", "red"]
// ["green", "green"]
// ["blue", "blue"]

Set的主要应用,可以与扩展运算符向结合,实现数组货或者是字符串的去重。

// 数组
let arr = [3, 5, 2, 2, 5, 5];
let unique = [...new Set(arr)]; // [3, 5, 2]// 字符串
let str = "352255";
let unique = [...new Set(str)].join(""); // "352"

Map

Map类型是键值对的有序列表,而键和值都可以是任意类型。Map是一种叫做字典的数据结构。Map本身是一个构造函数,用来生成 Map数据结构。const m = new Map()。其具有常见属性和方法如下。

size 属性:size属性返回 Map 结构的成员总数。

const map = new Map();
map.set('foo', true);
map.set('bar', false);
map.size // 2

set():设置键名key对应的键值为value,然后返回整个 Map 结构。如果key已经有值,则键值会被更新,否则就新生成该键。同时返回的是当前Map对象,可采用链式写法。

const m = new Map();
m.set('N-A', 6)        // 键是字符串
m.set(262, 'standard')     // 键是数值
m.set(undefined, 'nah')    // 键是 undefined
m.set(1, 'a').set(2, 'b').set(3, 'c') // 链式操作

get():get方法读取key对应的键值,如果找不到key,返回undefined。

const m = new Map();
m.set(123, 'Hello ES6!') // 键是函数
m.get(123)  // Hello ES6!

has():has方法返回一个布尔值,表示某个键是否在当前 Map 对象之中。

const m = new Map();
m.set('N-A', 6);
m.has('N-A')   // true
m.has('ABC')   // false    

delete():delete方法删除某个键,返回true。如果删除失败,返回false。

const m = new Map();
m.set('N-A', 6);
m.has('N-A')   // true
m.delete('N-A')
m.has('N-A')  // false   

clear():clear方法清除所有成员,没有返回值。

let map = new Map();
map.set('foo', true);
map.set('bar', false);
map.size // 2
map.clear()
map.size // 0

Map同样提供了三个遍历器,keys():返回键名的遍历器。values():返回键值的遍历器。entries():返回键值对的遍历器。

const map = new Map([['F', 'no'],['T',  'yes'],
]);for (let key of map.keys()) {console.log(key);
}
// "F"
// "T"for (let value of map.values()) {console.log(value);
}
// "no"
// "yes"for (let item of map.entries()) {console.log(item[0], item[1]);
}
// "F" "no"
// "T" "yes"// 或者
for (let [key, value] of map.entries()) {console.log(key, value);
}
// "F" "no"
// "T" "yes"// 等同于使用map.entries()
for (let [key, value] of map) {console.log(key, value);
}
// "F" "no"
// "T" "yes"

好啦!本文就先到这里了,由于时间关系本文写得还不够细致和深入。不足之处还请各位见谅。有什么有疑问的知识点也欢迎各位探讨学习!提前祝各位1024程序员节快乐!最近天气变冷了,各位注意保暖!

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

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

相关文章

【JavaEE】网络编程(网络编程基础、Socket套接字)

一、网络编程基础 1.1、什么是网络编程? 网络编程,指网络上的主机,通过不同的进程,以编程的方式实现网络通信(或称为网络数据传输) 注意:我们只要满足进程不同就行;所以即便是同一…

Hadoop3教程(三十四):(生产调优篇)MapReduce生产经验汇总

文章目录 (164)MR跑得慢的原因(165)MR常用调优参数Map阶段Reduce阶段 (166)MR数据倾斜问题参考文献 (164)MR跑得慢的原因 MR程序执行效率的瓶颈,或者说当你觉得你的MR程…

[Model.py 02] 地图按比例放大的实现

要求:实现地图按比例放大 分析:考虑到地图放大过程中需要保留河流道路这些物体的相对位置关系,这里选择将河流和道路这些物体的坐标矩阵合并成terrain_matrix并对这个合并后的矩阵进行缩放处理。放大后的矩阵,根据矩阵中标记的物…

基于nodejs+vue市民健身中心网上平台mysql

市民健身中心网上平台分为用户界面和管理员界面, 用户信息模块:管理员可在后台添加、删除普通用户,查看、编辑普通用户的信息。 课程表管理模块:管理员可对课程表进行修改任课教师、新增某一堂课、删除某一堂课、查找课程、修改…

codeforces (C++ Chemistry)

题目: 翻译: 思路: 1、n组数据,每组输入两个数t,k和一个字符串,删除k个字符,剩下的字符能组成回文,则输出YES,否则输出NO。 2、用map记录字符串中每个字符出现的次数,su…

使用screen实现服务器代码一直运行

1.安装screen sudo apt install screen 2.创建一个screen(创建一个名为chatglm的新的链接,用来一直运行 screen -S chatglm 3.查看进程列表 screen -ls 创建之后,就可以在当前窗口利用cd命令进入要执行的项目中,开始执行&#xf…

Openssl数据安全传输平台007:共享内存及代码的实现 ——待完善项目具体代码和逻辑

文章目录 0. 代码仓库1. 使用流程案例代码: 2. API解析2.1 创建或打开一块共享内存区2.2 将当前进程和共享内存关联到一起2.3 将共享内存和当前进程分离2.4 共享内存操作 -( 删除共享内存 ) 3. 思考问题3. ftok函数4. 共享内存API封装-以本项…

基于SSM的仓库管理系统

基于SSM的仓库管理系统的设计与实现【文末源码】 开发语言:Java数据库:MySQL技术:SpringSpringMVCMyBatisVue工具:IDEA/Ecilpse、Navicat、Maven 系统展示 登录界面 管理员界面 员工管理 货物管理 员工界面 摘要 当考虑构建基于…

[ 云计算 | AWS 实践 ] Java 如何重命名 Amazon S3 中的文件和文件夹

本文收录于【#云计算入门与实践 - AWS】专栏中,收录 AWS 入门与实践相关博文。 本文同步于个人公众号:【云计算洞察】 更多关于云计算技术内容敬请关注:CSDN【#云计算入门与实践 - AWS】专栏。 本系列已更新博文: [ 云计算 | …

day01_matplotlib_demo

文章目录 折线图plot多个绘图区绘制数学函数图像散点图scatter柱状图bar直方图histogram饼图pie总结 折线图plot import matplotlib.pyplot as pltplt.figure(figsize(15, 6), dpi80) plt.plot([1, 0, 9], [4, 5, 6]) plt.show()### 展现一周天气温度情况 # 创建画布 plt.figu…

留意差距:弥合网络安全基础设施的挑战

您最近一直在关注日益增加的网络威胁吗?如果您发现自己沉浸在 IT 或技术中,那么您可能会永远追求与时俱进。每天都会出现新的漏洞,这对保持消息灵通提出了巨大的挑战。 构建和维护能够应对复杂攻击者的网络安全基础设施所面临的挑战是真实存…

最新AI智能写作创作系统源码V2.6.4/AI绘画系统/支持GPT联网提问/支持Prompt应用

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统AI绘画系统,支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署…

Windows 安装 Java

1. 安装 JDK 从 Oracle 的官网下载的 JDK,例如 JDK 21 双击下载得到的 msi 文件,开始安装 JDK 选择要安装的文件路径(我一般都默认): 等待安装: 安装完成: 2. 验证是否安装成功 2.1. 打开 cmd…

【JavaEE重点知识归纳】第10节:Object类和String类

目录 一:Object类 1.概念 2.获取对象信息 3.对象比较equals方法 4.hashCode方法 二:String类 1.String类的重要性 2.常用方法 3.StringBuilder和StringBuffer 一:Object类 1.概念 (1)Object类是Java默认提供…

Easyx趣味编程7,鼠标消息读取及音频播放

hello大家好,这里是dark flame master,今天给大家带来Easyx图形库最后一节功能实现的介绍,前边介绍了绘制各种图形及键盘交互,文字,图片等操作,今天就可以使写出的程序更加生动且容易操控。一起学习吧&…

算法通过村第十五关-超大规模|黄金笔记|超大规模场景

文章目录 前言对20GB文件进行排序超大文本中搜索两个单词的最短距离从10亿数字中寻找小于100万个数字总结 前言 提示:你生命的前半辈子或许属于别人,活在别人的认为里。那把后半辈子还给自己,去追随你内在的声音。 --荣格 理解了前面的几个题…

Openssl数据安全传输平台006:粘包的处理-代码框架及实现-TcpSocket.cpp

文章目录 0. 代码仓库1. TCP通信粘包问题2. 粘包、拆包表现形式2.1 正常情况2.2 两个包合并成一个包2.3 出现了拆包 3. 粘包的处理-参考仓库中的文件TcpSocket.cpp3.1 发送数据时候的处理3.2 接收数据时候的处理 0. 代码仓库 https://github.com/Chufeng-Jiang/OpenSSL_Secure_…

Node学习笔记之Express框架

一、express 介绍 express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架,官方网址:https://www.expressjs. com.cn/ 简单来说,express 是一个封装好的工具包,封装了很多功能,便于我们开发 WEB 应用&…

局域网下多台windows电脑时间同步

windows时间同步 最近在项目中遇见了多台windows电脑的时间同步问题。在这个项目中,有五台电脑,五台电脑处于同一局域网下,其中有一台可以连接互联网(A电脑)。我需要将其他四台电脑(B、C、D、E电脑&#xf…