jsES6+新语法

目录

  • 模板字符串
    • 标签模板字符串
  • 函数增强
    • 默认值与解构
    • 剩余参数
      • rest和arguments
    • 箭头函数
  • 展开语法
  • Symbol
  • Set
    • Set方法
    • weakSet
      • weakSet常用方法
  • Map
    • Map常用方法
    • weakMap
      • weakMap常用方法
  • Promise
  • Proxy/Reflect
  • 迭代器与生成器
  • ES6+新增方法
    • includes
    • **
    • Object.values
    • Object.entries
    • padStart/padEnd
    • trim
    • flat/flatMap
    • Object.fromEntries
    • BigInt
    • 空值合并运算符(??)
    • 可选链
    • globalThis
    • FinalizationRegistry
    • WeakRef
    • Object.hasOwn
    • New members of classes

模板字符串

ES6之前如果我们想要将变量动态的放入到字符串中是非常麻烦的
而在ES6中提供了模版字符串的写法
这种写法可以轻松实现上述需求
模版字符串与普通字符串最大区别在于普通字符串用""''包裹,而模版字符串则用``包裹
以下是一个简单的模版字符串

var name = "张三"
var age = "20"
var str = `name:${name};age:${age}`   

我们可以在``中通过${}来动态的放入内容
${}中不仅能放变量,还能放表达式,乃至运行函数

var name = "张三"
var age = "20"
function foo() {
    return "Function foo"
}
var str = `name:${name};age:${age < 18 ? "未成年" : "成年"};${foo()}`

标签模板字符串

标签模板字符串是模版字符串的一种更高级的应用形式,它可以通过将模版字符串传入函数,由函数来解析模版字符串,最后返回被操作过的字符串,这个函数也被称为标签函数

var name = "张三"
var age = "20"
function foo() {
    return "Function foo"
}
function tag(strings, ...args) {
    console.log(strings)
    console.log(args)
}
tag`name:${name};age:${age < 18 ? "未成年" : "成年"};${foo()}`

控制台打印结果如下
结果
可以看到标签函数的第一个参数为一个数组,里面存储着被分割的字符串,剩下的参数为动态传入的值
这里传入的值是计算之后的值,而不是原始表达式
其中strings有一个特殊属性raw,我们可以通过它来访问原始字符串而不需转义特殊字符

函数增强

默认值与解构

ES6中我们可以在函数参数列表给参数一个默认值,当这个参数没有传值时默认使用默认值
以下是一个简单的默认值使用

function fn(x = 1, y = 2) {
    console.log(x, y)
}
fn()
fn(3, 4)

控制台结果如下
结果
默认值也可以引用前面已经定义的默认值

function fn(x = 1, y = x + 2) {
    console.log(x, y)
}
fn()
fn(3)
fn(3, 4)

控制台结果如下
结果
参数默认值也可以和参数解构联系使用

function fn({ x = 1, y = x + 2 } = {}) {
    console.log(x, y)
}
fn({})
fn({ x: 3 })
fn({ x: 3, y: 4 })

控制台结果如下
结果

剩余参数

ES6以前如果我们想要知道函数被调用时传递了多少参数就需要使用arguments关键字
ES6之后引入了剩余参数(rest)这个新语法,它可以将不定数量的参数放入一个数组中
rest的用法也很简单,只需要在参数前加上...就行
下面是一个简单的rest用法

function fn(name = "lisi", ...args) {
    console.log(name, ...args)
}
fn()
fn("zhangsan")
fn("zhangsan", 1, 2, 3)

控制台结果如下
结果

rest和arguments

可以发现和arguments最大的不同之处在于arguments是一个伪数组,无法使用数组相关的方法,而rest是一个数组
除了这个区别之外,argumentsrest还有以下其它区别

  1. arguments里存储着全部传入的参数rest只存储着没有形参对应的参数
  2. arguments是早期ECMAScript中为了方便获取参数所提供的一个数据结构,而rest是为了替代arguments而推出的
  3. rest必须放在参数列表最后,否则会报错

箭头函数

ES6中推出了一种新的函数范式箭头函数
以下是一个简单的箭头函数定义

var fn = () => {
    console.log("fn")
}
fn()

在此其中:fn是函数名,()中是参数,{}内部是函数体
需要注意的是,箭头函数没有显式的原型,这意味着它没有constructor,无法通过new构造对象
箭头函数中也没有绑定thisargumentssuper关键字,想要获取箭头函数中传入的全部参数只能使用rest

展开语法

展开语法可以在函数传参或者数组构造时,将数组或者字符串在语法层面展开
还可以在构造字面量对象时,将对象表达式按键值对的方式展开
以下是一个关于展开语法简单的演示

var fn = (x, y, z) => {
    console.log(x, y, z)
}
var arr = [1, 2, 3]
fn(...arr)

Symbol

SymbolES6中新增的一个基本数据类型,可用于构造一个独一无二的值
ES6之前,我们很难避免因属性名冲突而导致的value覆盖问题
如我们希望向某个对象中添加一个属性,但这个操作可能会因为原对象中已经存在这个属性而导致value覆盖的问题
ES6中为了解决这个问题于是就推出了Symbol,由于Symbol构造出来的值是唯一的,所以可以用这个值来当对象的属性名而不用担心覆盖问题
以下是Symbol的一个简单演示

var s1 = Symbol()
var s2 = Symbol("s2")
var obj = {
    [s1]: "s1",
    [s2]: "s2"
}
console.log(obj)

控制台结果如下
结果
需要注意的是通过Symbol构建的变量想要作为属性名需要用[]括起来
每次调用Symbol所创建的值都是唯一的,如果我们需要创建两个相同Symbol值可以用for方法,也可以通过keyFor的方法拿到key

var s1 = Symbol.for("fn")
var s2 = Symbol.for("fn")
console.log(s1 == s2)
var key1 = Symbol.keyFor(s1)
var key2 = Symbol.keyFor(s2)
console.log(key1, key2)

控制台结果如下
结果

Set

SetES6中新增的数据结构,可以用来保存数据,类似于数组,但是Set中的元素不能重复
Set只能通过new来构造
Set中可以存放基本数据类型复杂数据类型
以下是一个简单的Set例子

var set = new Set();
set.add(1)
set.add(2)
set.add(3)
var set2 = new Set([4, 5, 6])
var arr = [1, 2, 2, 2, 3, 4]
var set3 = new Set(arr)
console.log(set, set2, set3)

控制台结果如下
结果
可以看到Set也能用来给数组去重

Set方法

Set的常用方法有以下几个

  1. add():向指定Set添加某个元素,返回这个Set本身
  2. delete():将指定Set中的指定元素删除,成功返回true,失败返回false
  3. has():判断指定Set中是否有指定元素,如果有就返回true,失败就返回false
  4. clear():清空指定Set,无返回值
  5. forEach():同其他forEach

Set同样支持for...of遍历

weakSet

weakSetSet类似,都不能存储相同的元素,不同的是weakSet只能存储对象符号类型
weakSet中存储的是一定会被删除的元素,所以其只能存储对象符号
weakSet对元素的引用是弱引用,这意味着如果没有其他对weakset引用的对象的引用存在,则此对象将会被GC
weakSet的定义和Set类似,只能通过new来构造

var weak = new WeakSet()

weakSet常用方法

weakSet的方法比Set少了clearforEach,因为weakSet不可枚举

  1. add():向指定weakSet中添加指定元素,返回指定的weakSet对象
  2. delete():将指定的weakSet中指定的元素删除,成功返回true,失败返回false
  3. has():判断指定weakSet中指定的元素是否存在,存在返回true,失败返回false

Map

Map结构用来存储映射关系,在ES6之前我们可以通过对象来存储映射关系,但对象只能将字符串来作为key,Map则可以将对象也作为key
以下是一个简单的Map示例

var obj1 = {
    key: "value1"
}
var obj2 = {
    key: "value2"
}
var map = new Map()
map.set(obj1, "obj1")
map.set(obj2, "obj2")
map.set("aaa", "aaa")
map.set(1, 1)
var map2 = new Map([
    [obj1, "value1"],
    [obj2, "value2"],
    [1, 1],
    ["aaa", "aaa"]
])
console.log(map, map2)
console.log(map2.size)

控制台结果如下
结果
我们可以通过size这个属性来访问map中存储了多少映射关系

Map常用方法

Map的常用方法有以下几个

  1. set(key,value):向指定Map中添加指定映射关系,返回指定的Map对象
  2. get():在指定Map中通过指定的key寻找对应的value
  3. has():在指定的Map中判断指定的key是否存在,存在返回true,不存在返回false
  4. delete():在指定的Map中删除指定key的映射关系,成功返回true,失败返回false
  5. clear():清空指定Map,无返回值
  6. forEach():同其他forEach

Map同样也可以通过for...of遍历

weakMap

weakMapweakSet类似,weakMap只能由对象类型来组成key,并且weakMapkey对其对象是弱引用,与weakSet相同,weakMap同样不能枚举

var weak = new WeakMap()

weakMap常用方法

weakMap常用方法有以下几个

  1. set(key,value):向指定weakMap中添加指定映射关系,返回指定的weakMap对象
  2. get():在指定weakMap中通过指定的key寻找对应的value
  3. has():在指定的weakMap中判断指定的key是否存在,存在返回true,不存在返回false
  4. delete():在指定的weakMap中删除指定key的映射关系,成功返回true,失败返回false

Promise

关于Promise的具体用法可以看我这篇博客
Promise

Proxy/Reflect

关于ProxyReflect可以看我这篇博客
未动笔,未来可寄

迭代器与生成器

关于迭代器生成器可以看我这篇博客
迭代器与生成器

ES6+新增方法

includes

用来判断元素是否在数组中,如果存在就返回true,不存在就返回false

var arr = [1, 2, 3, 4]
console.log(arr.includes(5))
console.log(arr.includes(4))

控制台结果如下
结果

**

用来计算乘方

var num1 = Math.pow(2, 2)
var num2 = 2 ** 2

Object.values

我们可以通过这个来获取对象的所有值

var obj = {
    name: "zhangsan",
    age: 18,
    sex: "男"
}
console.log(Object.values(obj))
console.log(Object.values("aaa"))

控制台结果如下
结果

Object.entries

Object.entries可以获取到一个数组,数组中会存放可枚举属性的键值对数组

var obj = {
    name: "zhangsan",
    age: 18,
    sex: "男"
}
console.log(Object.entries(obj))

结果

padStart/padEnd

padStart用于对字符串首部填充
padEnd用于对字符串尾部填充

var message = "hello world!"
console.log(message.padStart(15, "#"))
console.log(message.padEnd(15, "#"))

结果

trim

我们可以通过trim来清除字符串首尾的空格,也可以通过trimStart来清除字符串首部空格,trimEnd来清除字符串尾部的空格

var str = "    hello world   "
console.log("aaa" + str.trim() + "aaa")
console.log("aaa" + str.trimStart() + "aaa")
console.log("aaa" + str.trimEnd() + "aaa")

结果

flat/flatMap

flat方法可以指定一个深度来遍历多维数组,并将遍历到元素组成一个新数组返回

var arr = [[1, 1, 1], 2, [3, [4, 4]]]
console.log(arr.flat(1))
console.log(arr.flat(2))

结果
flatMap会将数组中的每个元素应用于给定的回调函数,再将得到的结果组成一个新数组,并将这个新数组展开一层,可以理解为先将数组进行Map操作在进行flat(1)操作,比单独调用这两个方法更加高效

var arr = [[1, 1, 1], 2, [3, [4, 4]]]
var arr2 = arr.flatMap(function (res) {
    return res
})
console.log(arr2)

结果

Object.fromEntries

我们可以将通过Object.entries得到的数组重新转化为对象

var obj = {
    name: "zhangsan",
    age: 18,
    sex: "男"
}
var entries = Object.entries(obj)
var obj2 = Object.fromEntries(entries)
console.log(obj2)

结果

BigInt

一个新的数据类型,可以表示以前js无法表示的大整数
用法很简单,只需要在数字后面加上n就行

var num = 99999999999999999999999999
var num2 = 99999999999999999999999999n
console.log(num)
console.log(num2)

结果

空值合并运算符(??)

空值合并运算符(??)是一个逻辑运算符当左侧的操作数为null或者undefined时,返回其右侧操作数,否则返回左侧操作数

可选链

可选链具体来说应该是一个新运算符(?.)它可以读取对象所访问的属性是否为,并且返回undefined,不同与.运算符,当它访问到不存在的属性时会报错,而?.不会

var obj = {
    name: "zhangsan",
    friend: {
       name: "lisi",
       friend: {
          name: "wangwu"
       }
   }
}
console.log(obj?.friend?.friend?.friend?.name)
console.log(obj.friend.friend.friend.name)

结果

globalThis

因为js运行环境不同,其全局对象往往也会不同,我们就需要使用不同的关键字来访问全局对象
新标准中规定了globalThis这个关键字用于访问全局对象

FinalizationRegistry

FinalizationRegistry对象允许被注册对象回收时执行设定好的回调函数
通过调用register来设定注册对象以及传入回调函数的参数

var registry = new FinalizationRegistry(function (res) {
    console.log(`${res}被回收了`)
})
let obj1 = {
    key: "value"
}
let obj2 = {
    key: "value"
}
registry.register(obj1, "obj1")
registry.register(obj2, "obj2")
obj1 = null
obj2 = null

结果

WeakRef

当我们将一个对象赋值给另一个引用的话这个引用默认是一个强引用,如果我们需要这个引用弱引用的话需要用WeakRef

var obj1 = {
    key: "value"
}
var obj2 = new WeakRef(obj1)

Object.hasOwn

Object.hasOwn用于判断一个对象中是否有指定的属性

var obj1 = {
    key: "value"
}
console.log(Object.hasOwn(obj1, "key"))
console.log(Object.hasOwn(obj1, "name"))

结果
其中hasOwn的第一个参数为需要判断的对象,第二参数为需要判断的key

New members of classes

新标准中针对class成员字段提供了新的修饰符
static修饰符表示此属性/方法只能通过来调用
字段名前加#号代表此字段私有
可以使用in运算符检查私有字段是否存在。当私有字段存在时返回true,否则返回false

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】几种常用的类型转换

类型转换 c语言中的类型转换C的类型转换static_castreinterpret_castconst_castdynamic_cast c语言中的类型转换 在C语言中我们经常会遇到类型转化的问题&#xff0c;主要分为两种&#xff1a;显式类型转换和隐式类型转换。 显式类型转换&#xff1a;就是程序员使用强制类型转…

Java-字符串-String类

1 需求 1.1 Field Summary 1.2 Constructor Summary public String() : 空构造public String(byte[] bytes) : 把字节数组转成字符串public String(byte[] bytes,int index, int length) : 把字节数组的一部分转成字符串public String(char[] value) : 把字符数组转成字符串p…

学生备考护眼灯哪个牌子好性价比高?2024最新台灯分享

现在越来越多90后家长有了孩子&#xff0c;而年轻家长也更加重视孩子们的成长健康&#xff0c;特别是小孩子的近视率越来越高&#xff0c;家长们就会选择护眼台灯来为孩子的视力保驾护航。但很多家长在选购时&#xff0c;面对各式各样的台灯却又陷入迷茫&#xff0c;究竟该怎么…

高校电力能耗监测精细化管理系统,提升能源利用效率的利器

电力是高校不可离开的重要能源&#xff0c;为学校相关管理人员提供在线用能查询统计等服务。通过对学校照明用电、空调用电等数据的采集、监控、分析&#xff0c;为学校电能管理制定合理的能源政策提供参考。同时&#xff0c;也可以培养学生的节能意识&#xff0c;学校后勤电力…

大模型学习第二课

学习目标&#xff1a; 浦语大模型趣味Demo 学习内容&#xff1a; 学习时间&#xff1a; 20240108 学习产出&#xff1a; InternLM介绍 大模型&#xff1a;人工智能领域钟参数数量巨大、拥有庞大计算能力和参数规模的模型。InternLM模型全链条开源&#xff0c;7B&#xff0c;…

[SpringBoot]接口的多实现:选择性注入SpringBoot接口的实现类

最近在项目中遇到两种情况&#xff0c;准备写个博客记录一下。 情况说明&#xff1a;Service层一个接口是否可以存在多个具体实现&#xff0c;此时应该如何调用Service&#xff08;的具体实现&#xff09;&#xff1f; 其实之前的项目中也遇到过这种情况&#xff0c;只不过我采…

企业一体化管理建设:制造业如何应对信息孤岛和流程断点?-亿发

未来&#xff0c;制造业将成为市场经济的重要支柱。缺乏制造业的支持&#xff0c;整个供应链将受到市场波动的冲击。因此&#xff0c;改革传统的制造业生产和管理方式是市场经济转型的不可或缺的条件。数字化转型趋向于多领域、多行业&#xff0c;企业若要实现长远发展&#xf…

服务器故障与管理口与raid

一&#xff0c;服务器常见故障 1&#xff0c;系统不停重启进入不了系统 排查是否是硬件故障&#xff0c;系统盘是否损坏&#xff08;硬盘灯红色&#xff0c;黄色&#xff0c;绿色&#xff09; 查看系统第一启动项是那种方式(硬盘 网络网卡 光驱 U盘) bios 是否双系统&#x…

面向对象软件设计与分析40讲(36)软件开发过程模型之增量模型

文章目录 1 概念2 优点3 缺点4 适用范围1 概念 增量模型强调将整个项目划分为多个增量或阶段,并在每个增量中逐步构建和交付系统的功能。每个增量是对系统的一个部分进行开发、测试和交付,形成一个可用的子系统。 以下是增量过程模型的主要特点和步骤: 划分增量:根据项目…

2024前端炫酷源码分享(附效果图及在线演示)

分享10款非常有趣的前端特效源码 其中包含css动画特效、js原生特效、svg特效以及小游戏等 下面我会给出特效样式图或演示效果图 但你也可以点击在线预览查看源码的最终展示效果及下载源码资源 GSAP-火箭动画特效 GSAP 火箭动画 当氮气充足的情况下 火箭会冲出 并继续飞行 图片…

基于Spring Boot+Vue的课堂管理系统(前后端分离)

该项目完全免费 介绍 基于Spring BootVue的课堂管理系统。前后端分离。包含教师授课管理、学生选退课、聊天室、签到、笔记管理模块等。 技术架构 SpringBoot MyBatis Redis WebSocket VueCLI Axios Element UI 项目特点&#xff1a; 1、后台使用MyBatis连接数据库&…

2024年1月7日15:09:50

2024年1月7日15:09:55复习&#xff1a;我今天学了有价值的东西&#xff0c;那就是在瓦罗兰特拿到了三杀 2024年1月7日15:11:10学习了如何使用vivopad2的键盘 可以稍微用一下 2024年1月7日15:17:58 学习一个编程的题目 2024年1月7日15:31:27不用机械键盘打字效率就是比不用低…

DC电源模块的安全性能评估及认证标准

BOSHIDA DC电源模块的安全性能评估及认证标准 DC电源模块的安全性能评估和认证标准主要涉及以下方面&#xff1a; 1. 安全标准&#xff1a;DC电源模块需要符合国际电工委员会&#xff08;IEC&#xff09;和国家标准的相关规定&#xff0c;如IEC 60950-1&#xff08;信息技术…

(一)看参考手册学stm32基于hal库,点灯时钟配置

&#xff08;一&#xff09;看参考手册学stm32基于hal库&#xff0c;点灯时钟配置 这篇文章主要是个人的学习经验&#xff0c;想分享出来供大家提供思路&#xff0c;如果其中有不足之处请批评指正哈。 废话不多说直接开始主题&#xff0c;本人是基于STM32F407VET6芯片&#xf…

静态网页设计——个人图书馆(HTML+CSS+JavaScript)(dw、sublime Text、webstorm、HBuilder X)

前言 声明&#xff1a;该文章只是做技术分享&#xff0c;若侵权请联系我删除。&#xff01;&#xff01; 感谢大佬的视频&#xff1a; https://www.bilibili.com/video/BV1VN4y1q7cz/?vd_source5f425e0074a7f92921f53ab87712357b 源码&#xff1a;https://space.bilibili.co…

Java多线程并发篇----第一篇

系列文章目录 文章目录 系列文章目录前言一、JAVA 并发知识库二、Java中实现多线程有几种方法三、继承 Thread 类四、实现 Runnable 接口。前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了…

第12课 实现桌面与摄像头叠加

在上一节&#xff0c;我们实现了桌面捕获功能&#xff0c;并成功把桌面图像和麦克风声音发送给对方。在实际应用中&#xff0c;有时候会需要把桌面与摄像头图像叠加在一起发送&#xff0c;这节课我们就来看下如何实现这一功能。 1.备份与修改 备份demo11并修改demo11为demo12…

【产品人卫朋】硬件产品经理:从入门到精通

目录 本文目录 1. 前言说明 2. 内容说明 3. 资料包说明 作者简介 本文目录 1. 前言说明 2. 内容说明 3. 资料包说明 1. 前言说明 本篇内容节选自实体书《硬件产品经理&#xff1a;从入门到精通》。 2. 内容说明 鉴于硬件产品的特殊性&#xff0c;不同产品阶段的时间间…

Gin 项目引入热加载

Gin 项目引入热加载 文章目录 Gin 项目引入热加载一、什么是热加载二、Air2.1 介绍2.2 特性特性&#xff1a;2.3 相关文档2.4 安装推荐使用 install.sh使用 go install 2.5 配置环境变量2.6 使用 三、Fresh3.1 介绍3.2 相关文档3.3 安装与使用 四、bee4.1 介绍4.2 相关文档4.3 …

python统计分析——箱线图(plt.boxplot)

参考资料&#xff1a;用python动手学统计学 使用matplotlib.pyplot.boxplot()函数绘制箱线图 import numpy as np import pandas as pd from matplotlib import pyplot as pltdata_set1np.array([2,3,3,4,4,4,4,5,5,6]) data_set2np.array([[2,3,3,4,4,4,4,5,5,6],[5,6,6,7,7…