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

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

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

相关文章

裁员+失恋或许不能比这更遭了,敬一塌糊涂与充满感动的2023,也敬曾经的挚爱与寒冬的冰霜

~ 随机抽取评论区的 3位 小伙伴送上精美礼品 ~ 参与方式&#xff1a;关注、点赞、收藏&#xff0c;评论 "2024&#xff0c;一天当做两天卷&#xff01;" 活动时间&#xff1a;截止到 2024-01-21 00:00:00 礼品清单&#xff1a;CSDN活动周边、自选图书 本文目录 序 …

基于SSM的毕业设计选题系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【Sublime Text】| 02——常用插件安装及配置

系列文章目录 【Sublime Text】| 01——下载软件安装并注册 【Sublime Text】| 02——常用插件安装及配置 失败了也挺可爱&#xff0c;成功了就超帅。 文章目录 1. 汉化2. 更换颜色主题3. 更改编码插件—ConvertToUTF84. 对齐插件—Alignment5. 括号高亮插件—BracketHighligh…

JVM工作原理与实战(八):类加载器的分类

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、类加载器介绍 二、类加载器的分类 1.Java代码实现的类加载器 2.Java虚拟机底层源码实现的类加载器 3.默认的类加载器层次&#xff08;JDK8及之前的版本&#xff09; 总结 前言…

python总结-装饰器

装饰器 装饰器解决日志问题&#xff08;分三个版本&#xff09;多个装饰器带参数的装饰器wraps装饰器内置装饰器property装饰器staticmethod装饰器classmethod装饰器 类装饰器 概念 装饰器来自 Decorator 的直译。什么叫装饰&#xff0c;就是装点、提供一些额 外的功能。在 pyt…

服务器GPU温度过高挂掉排查记录

服务器GPU挂掉 跑深度学习的代码的时候发现中断了。通过命令查看&#xff1a; nvidia-smi显示 Unable to determine the device handle for GPU 0000:01:00.0: Unknown Error。感觉很莫名其妙。通过重启大法之后&#xff0c;又能用一段时间。 shutdown -r now但是过了一个小…

我的NPI项目之设备系统启动(二) -- 系统启动阶段和分区的区别

系统启动的就几大阶段&#xff1a; 基于高通平台的Android OS启动过程&#xff0c;简单的说&#xff0c;可以分为一下几个部分&#xff1a; 之前一个比较老的平台大概是这样&#xff1a; 现在比较新的5G平台&#xff1a; 差别在这里&#xff0c;重点了解一下新平台的情况。xb…

如何批量自定义视频画面尺寸

在视频制作和编辑过程中&#xff0c;对于视频画面尺寸的调整是一项常见的需求。有时候&#xff0c;为了适应不同的播放平台或满足特定的展示需求&#xff0c;我们需要对视频尺寸进行批量调整。那么&#xff0c;如何实现批量自定义视频画面尺寸呢&#xff1f;本文将为您揭示这一…

基于SpringBoot的MusiQ音乐网站

目录 前言 开发环境以及工具 项目功能 用户&#xff1a; 后台&#xff1a; 设计详情​编辑 登陆页面 后台管理页面 首页 视频展示 源码获取 前言 本项目是一个基于IDEA和Java语言开基于SpringBoot的MusiQ音乐网站。应用包含管理端&#xff0c;教师端&#xff0c;学生…

Java线程同步机制

第1章&#xff1a;引言 大家好&#xff0c;我是小黑。今天咱们来聊聊并发编程&#xff0c;咱们经常听说并行、并发这些词&#xff0c;特别是在处理大量数据、高用户负载时&#xff0c;这些概念就显得尤为重要了。为什么呢&#xff1f;因为并发编程可以帮助咱们的应用程序更有效…

imgaug库指南(八):从入门到精通的【图像增强】之旅

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…

java: 写入数据到HBase

一、添加依赖 <dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-client</artifactId><version>2.6.0</version></dependency><dependency><groupId>org.apache.hbase</groupId><art…