ES6也称为ES2015,于2015年发布,此后每年都有新增一些属性,分别命名为ES7~12,发布的年份分别对应2016年到2021年

ES7

includes方法

数组中新增了includes方法,用来判断数组中是否存在某一元素,在此之前进行这样的判断是使用indexOf判断下标值,小于0时则代表不存在。

const list = ['alice', 'kiki', 'macus']

console.log(list.includes('alice'))
console.log(list.indexOf('alice')) console.log(list.includes('hello'))
console.log(list.indexOf('hello'))

includes返回布尔值,indexOf返回数组的下标

指数运算

ES7增加了指数运算的操作符,两个*号(**),在此之前通过 Math.pow 来计算

const num = 3
const sqrt = Math.pow(num, 4)
const result = num ** 4
console.log(sqrt, result)

以上都表示 num 的四次方,执行结果都为81

** 运算符通过babel编译成es5的语法时,也是使用的 Math.pow

ES8

Object.values和Object.entries

Object.keys (ES6之前就有的属性) 获取对象的所有key值,Object.values获取对象的所有value值,Object.entries会返回一个数组,数组中包含每一个key和value元素组成的数组

const obj = {
  name: 'alice',
  age: 18
}
const list = ['alice', 'kiki', 'macus']
const messsage = 'hello' console.log(Object.keys(obj), Object.values(obj), Object.entries(obj))
console.log(Object.keys(list), Object.values(list), Object.entries(list))
console.log(Object.keys(messsage), Object.values(messsage), Object.entries(messsage))

分别获取数组、对象和字符串的key、value和由key、value组成的数组

stringPadding

对字符串分别使用padStart和padEnd可以进行头、尾填充,传入填充后的字符串长度和填充内容

const message = "hello world"
const startMsg = message.padStart(15, '-')
const endMsg = message.padEnd(16, '*')
console.log(startMsg)
console.log(endMsg) const nickName = '星辰'
const firstName = nickName.substr(0, 1)
const newName = firstName.padEnd(nickName.length, '*')
console.log(newName)

分别对字符串的头尾进行了填充以及一个小案例

Trailing Commas

尾部逗号,允许函数在定义形参及传递参数的时候,最后一个参数后增加一个逗号(,)

function foo(a, b,){
  console.log(a, b,)
}
foo(1,2,) function baz(m, n){
  console.log(m, n)
}
baz('m', 'n',)

在最后一个参数后增加逗号,也不会被认为是错误的写法

getOwnPropertyDescriptors

用于获取对象的所有属性的描述

const obj = {
  name: 'alice',
  age: 18
}
console.log(Object.getOwnPropertyDescriptors(obj))

包含是否可枚举(enumerable)、可修改(writable)、重新定义(configurable)及value值

其它
  • async和await,这部分放到后面的文章中详细的记录

ES9

所有属性
  • iterators 迭代器,这部分放到后面的文章中详细的记录
  • spread operators,对象展开运算符,记录在 你知道ES6中的这些属性吗 这篇文章中
  • promise finally,和promise一起放到后面的文章中详细的记录

ES10

flat和flatMap

flat这个函数是用来对数组降维的,只需要传入需要降维的层级

const array = [1, 2, [3, 4], [[5, 6], [7, 8], [9]], [10], 11, 11, 11, [12, [13, [14]]]]
const num = array.flat(2)
console.log(num)

此时传入降维的层次是2,所以四维数组的数据降了两维,还有两维

flatMap这个方法会先对数组遍历,再进行降维操作,作用相当于map+flat

const list = ["macus mogan", "arish sira", "linda kiki"]
const result = list.flatMap(item => {
  const element = item.split(" ")
  console.log('每次拆分的元素:',element)
  return element
})
console.log(result)

此时遍历出每组元素时候,通过空格切割成数组,flatMap会直接降维

Object.fromEntries

Object.fromEntries是将entries这样的数组类型转换成对象

const obj = {
  name: 'alice',
  age: 18
}
const arr = ['alice', 'kiki', 'macus']
const str = 'hello'
const objEntries = Object.entries(obj)
const arrEntries = Object.entries(arr)
const strEntries = Object.entries(str) console.log(objEntries)
console.log(Object.fromEntries(objEntries))
console.log('--------------------------------------------------------------')
console.log(arrEntries)
console.log(Object.fromEntries(arrEntries))
console.log('--------------------------------------------------------------')
console.log(strEntries)
console.log(Object.fromEntries(strEntries))

分别将对象、数组、字符串变成entries后,再通过fromEntries转为对象,fromEntries并不是反向的Object.entries操作,不会恢复数组或者字符串的类型

trimStart trimEnd

trim可以用于去除首尾空格,ES10又增加了trimStart trimEnd分别用于在字符串头 尾部去除空格

const message = " hello world "
const messageLen = message.length
const trimMsg = message.trim()
const trimStartMsg = message.trimStart()
const trimEndMsg = message.trimEnd() console.log(messageLen)
console.log(trimMsg, trimMsg.length)
console.log(trimStartMsg, trimStartMsg.length)
console.log(trimEndMsg, trimEndMsg.length)

通过字符串的长度可以判断是否去除了首尾的空格

其它

ES11

bigInt

在此之前表示大数字可用 Number.MAX_SAFE_INTEGER,但这种表示方式如果要进行计算,是存在精度问题的,ES11增加了一种表示大数字的方式,在数字后面写上字母n,如1234567890987654321n。

但这种方式进行运算,仍有一些规则

  1. 带n的大数字是不可以与不带n的小数字进行运算的

    • 可以将小数字后面直接加个n
    • 或者通过BigInt方法将小数字转成大数字
  2. 将大数字通过转成小数字可能存在精度丢失的问题

const num = Number.MAX_SAFE_INTEGER
console.log(num + 1)
console.log(num + 2) const bigNum = 80082088208008208820n
console.log(bigNum + 10n)
console.log(bigNum + BigInt(10))
console.log(Number(bigNum))

以上MAX_SAFE_INTEGER运算 和 bigInt 转Number就都出现了精度丢失的问题

Nullish Coalescing Operator

空值合并操作符(??),对数据进行布尔值的判断,将null和undefined的数据判断为false,就会取运算符后面的值,而或运算符(||)对于null、undefined、空字符串和0都判断为false

const nullStr = null;
const undefinedStr = undefined;
const string = "";
const number = 0;
const user = {}; console.log(nullStr ?? "不存在的内容", nullStr || "不存在的内容");
console.log(undefinedStr ?? "不可识别的类型", undefinedStr || "不可识别的类型");
console.log(string ?? "空字符串", string || "空字符串");
console.log(number ?? "数字", number || "数字");
console.log(user ?? "空对象", user || "空对象");

两者仅在空字符串和数字0的情况判断会不一致

Optional Chining

可选链(?.)在对象中使用,对数据的存在/可读取与否进行判断,当它不为null和undefined时,才会往下操作。

const user = {
  name: 'alice',
  favorite: {
    sport: 'tennis'
  }
}
console.log(user?.favorite?.sport)
console.log(user && user.favorite && user.favorite.sport)
console.log(user?.info?.address)
console.log( user && user.info && user.info.address)

通过可选链与 && 操作符所实现的效果一致,但代码更为简洁

globalThis

javascript代码可以运行在浏览器或者nodejs中,这两个容器获取全局对象的方式不相同,在浏览器中可以通过 window 或者 this,在node端需要通过global。es11中进行了统一,使用globalThis,无论在浏览器端或者node端都可以直接获取全局对象。

console.log(globalThis)

浏览器中打印的是window对象,node端打印的是global对象

其它
  • for in 标准化,在es11之前,没有规定for in 遍历时的key需要取 key 还是 value,各浏览器都有自己的实现,es11指定标准,需使用key
  • Dynamic Import(动态导入),将记录在es模块化的文章中
  • Promise.allSettled,将记录在promise的文章中
  • import meta,将记录在es模块化的文章中

ES12

FinalizationRegistry

用于对象被垃圾回收器(GC)回收的时候指定一个回调,通过 register 进行注册

let user = {
  name: "alice",
};
const registry = new FinalizationRegistry((value) => {
  console.log("对象被销毁了", value);
});
registry.register(user, 'user')
user = null

GC是不定时的检测有没有可回收的垃圾,所以当对象指向null时,不会马上执行获取回调的函数,不能在nodejs中测试,只能在浏览器中测试,因为在nodejs中执行完成会关闭该进程,浏览器运行时是一个进程,不会关闭。

WeakRef

直接将对象A赋值给对象B,他们共同指向一个内存地址0x100,因为此时是强引用,即使A指向null之后,0x100仍被B指向,所以0x100不会被销毁。

如果希望A指向null之后,0x100被销毁,那么可以使用 weakRef 实现弱引用。

let user = { name: 'alice' }
let info = new WeakRef(user) const registry = new FinalizationRegistry((value) => {
  console.log("对象被销毁了", value);
});
registry.register(user, 'user')
registry.register(info, 'info') user = null
console.log(info, info.deref())

通过new关键字创建弱引用,通过deref方法获取数据,当引用的对象被回收后,弱引用生成的对象也就获取不到了

logical assignment operators

赋值逻辑运算,相当于是逻辑运算后,再进行赋值的操作

  • ||= 逻辑或赋值运算,先或运算,再赋值
  • &&= 逻辑与赋值运算,先与运算,再赋值
  • ??= 逻辑空赋值运算,先空值判断,再赋值
let num = 0
// num = num + 1 等同于下方写法
num += 1
console.log(num) let message = ''
// message = message || 'hello' 等同于下方写法
message ||= 'hello'
console.log(message) let user = {
  name: 'alice'
}
// user = user && user.name 等同于下方写法
user &&= user.name
console.log(user) let str = 0
// str = str ?? 'string' 等同于下方写法
str ??= 'string'
console.log(str)

逻辑赋值运算 就像+= 和 +1之后再赋值一样,是一种运算的语法糖

Numeric Separator

数字分隔符,较大的数字可以通过下划线(_)进行分割,使代码可读性更强

const momeny = 100_200_300_400_500
console.log(momeny)

执行结果会去除下划线,以十进制数据展示

replaceAll

replaceAll() 方法返回一个新字符串,新字符串所有满足 pattern(第一个参数) 的部分都已被replacement(第二个参数) 替换。

const message = "hello world";

console.log(message.replace("l", "*"));
console.log(message.replaceAll("l", "*"));

replaceAll会替换所有符合条件的,而replace只会替换掉第一个

以上就是ES7-12包含的大部分属性,关于js高级,还有很多需要开发者掌握的地方,可以看看我写的其他博文,持续更新中~

原来ES7~12分别增加了这些属性呀的更多相关文章

  1. 自定义View(二)增加View的属性

    增加View的属性有两种方法    1.在View类中添加    2.在xml资源文件中添加 一.在View类中添加    例:实现一个带文字的图片 public class MyView exten ...

  2. 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件增加了 PlaceholderText 属性

    [源码下载] 重新想象 Windows 8.1 Store Apps (77) - 控件增强: 文本类控件的增强, 部分控件增加了 Header 属性和 HeaderTemplate 属性, 部分控件 ...

  3. php 修改、增加xml结点属性的实现代码

    php修改xml结点属性,增加xml结点属性的代码,有需要的朋友可以参考下 php 修改 增加xml结点属性的代码,供大家学习参考.php修改xml结点属性,增加xml结点属性的代码,有需要的朋友,参 ...

  4. Heritrix源码分析(十一) Heritrix中的URL--CandidateURI和CrawlURI以及如何增加自己的属性(转)

    本博客属原创文章,欢迎转载!转载请务必注明出处:http://guoyunsky.iteye.com/blog/649889 本博客已迁移到本人独立博客: http://www.yun5u.com/ ...

  5. nopcommerce 4.1 core 学习 增加商城配置属性

    需求:  原本是想用nop 来做国际版的商城,可以像亚马逊那样 国内外通用,  专门增加一个跨进元素属性. 学习里面的一些架构思想.  国内的行情还是 像himall  会比较实用. 这是在商城的综合 ...

  6. Vue小案例 之 商品管理------修改商品数量以及增加入库日期属性

    实现修改商品的数量: 加入的代码: css: .clear-btn{ text-align: right; padding-right: 10px; } .table-warp a{ text-dec ...

  7. (1-2)line-height的各类属性值

    (1-2)line-height的各类属性值 首先来个疑问!没有问题印象不深嘛 一.line-height支持哪些属性值呢? 五只手指头就能数过来了咯. 比如normal, <number> ...

  8. js实现双向链表, 双向链表需要增加一个previous属性

    双向链表, 双向链表需要增加一个previous属性 /*双向链表 * */ function Node(element) { this.element = element; this.next = ...

  9. WPF 使用附加属性增加控件属性

    使用附加属性增加控件属性,使得这个附加属性在使用的时候没有局限性,可以在任何的控件中使用它来增加所需要的属性,使得控件的属性使用起来非常灵活 一.自定义附加属性 using System; using ...

  10. JS---封装缓动(变速)动画函数---增加任意一个属性

    封装缓动(变速)动画---增加任意一个属性 1. 本来的变速动画函数,是获取特定的属性(之前案例是向右移动,所以获取的是left属性) 2. 现在改变为,获取任意一个属性,使其移动到指定的target ...

随机推荐

  1. iframe分栏拖拽伸缩例子

    这个标题有些绕口,鄙人愚笨,实在找不到一个比较准确的说法,总之就是: 一个页面内显示多个iframe,一个变宽,另一个就变窄,一个变高,另一个就变矮的这种可自由伸缩的效果.它们之间有一个可多拽的分隔条 ...

  2. 2022-11-26:给定一个字符串s,只含有0~9这些字符 你可以使用来自s中的数字,目的是拼出一个最大的回文数 使用数字的个数,不能超过s里含有的个数 比如 : 39878,能拼出的最大回文数是

    2022-11-26:给定一个字符串s,只含有0~9这些字符 你可以使用来自s中的数字,目的是拼出一个最大的回文数 使用数字的个数,不能超过s里含有的个数 比如 : 39878,能拼出的最大回文数是 ...

  3. dnu

    背景 作为一个喜欢搬运 YouTube 视频的网友,我发现将视频下载下来再上传到 B 站十分繁琐,因此我决定开发一个小工具,能够方便快捷地将 YouTube 视频下载并上传至 B 站,以节省我的时间和 ...

  4. Python生成随机验证

    Python生成随机验证码   Python生成随机验证码,需要使用PIL模块. 安装: 1 pip3 install pillow 基本使用 1. 创建图片 1 2 3 4 5 6 7 8 9 fr ...

  5. kafka集群是如何选择leader,你知道吗?

    前言 kafka集群是由多个broker节点组成,这里面包含了许多的知识点,以下的这些问题你都知道吗? 你知道topic的分区leader是怎么选举的吗? 你知道zookeeper中存储了kafka的 ...

  6. 在树莓派上实现numpy的LSTM长短期记忆神经网络做图像分类,加载pytorch的模型参数,推理mnist手写数字识别

    这几天又在玩树莓派,先是搞了个物联网,又在尝试在树莓派上搞一些简单的神经网络,这次搞得是LSTM识别mnist手写数字识别 训练代码在电脑上,cpu就能训练,很快的: import torch imp ...

  7. JVM系统参数

    JVM(Java虚拟机)是Java程序的运行环境,它可以通过一些系统参数进行配置和优化.以下是一些常用的JVM系统参数: 1. -Xmx: 用于设置JVM堆的最大内存大小.例如,-Xmx1g表示将堆的 ...

  8. VSCode 中利用 Remote SSH 连接远程服务器

    北京时间 2019 年 5 月 3 日,在 PyCon 2019 大会上,微软发布了 VS Code Remote.这是一个用来实现远程开发的功能插件,对于许多使用 Windows 进行开发,但是需要 ...

  9. Greenplum 上手

    最近因为一个项目需要,我们准备考虑使用 Greenplum 应用在我们的大数据平台中的数据治理项目中,期待着可以在我们的项目过程中有着更大的价值发现 Greenplum 介绍 Greenplum是一种 ...

  10. Pinot2的无人机任务和数据处理实践

    目录 1. 引言 2. 技术原理及概念 2.1 基本概念解释 2.2 技术原理介绍 2.3 相关技术比较 3. 实现步骤与流程 4. 应用示例与代码实现讲解 4.1 应用场景介绍 4.2 应用实例分析 ...