ES6-ES12部分简单知识点总结,希望对大家有用~
ES6-ES12简单知识点总结
1.ES6相关知识点
1.1.对象字面量的增强
ES6中对对象字面量的写法进行了增强,主要包含以下三个方面的增强:
- 属性的简写:当给对象设置属性时,如果希望变量名和属性名一样就可以直接写该变量名;
- 方法的简写:对象中的方法可直接写成
foo() {}
的形式; - 计算属性名:对象的属性名可以动态传入,将变量使用
[]
包裹即可;
1.2.解构
为了方便从数组或对象中获取数据,ES6给我们提供了解构的方案,可分为数组的解构和对象的解构。
-
数组的解构:注意数组的解构是按元素顺序来的。
-
对象的解构:对象的解构是不按顺序的,是根据key来赋值的。
-
解构的应用场景:一般开发中拿到一个变量,可以对其进行解构使用,比如对函数的参数进行解构。
1.3.let和const的使用
在ES5中,声明变量都是使用var,从ES6开始新增了两个声明变量的关键字let和const。
-
let关键字:从直观的角度来说,let和var是没有太大的区别的,都是用于声明一个变量。
-
const关键字:const声明的变量称为常量,表示保存的数据一旦被赋值就不能再被修改了,但是如果是引用类型的数据,还是可以通过引用找到对应的对象进行修改的。
-
注意:与var不同的是,let和const是不允许重复声明变量的。并且使用let和const声明的变量是具有自己的块级作用域的。var和let可以不设置初始值,const必须设置。
有关作用域提升的问题:
使用过var关键字的人都知道,var声明的变量是会进行作用域提升的,如果使用let和const声明的变量,是不允许在声明之前对其进行访问的,会直接报错。
为什么var声明的变量有作用域提升,而let和const没有呢?
- 作用域提升:在声明变量的作用域中,如果这个变量可以在声明之前被访问,那么就可以称之为作用域提升。
- 在JavaScript执行之前,会先对我们声明的变量进行收集创建,普通变量的默认值都为undefined,只有等到执行赋值代码时,该变量才会被真正赋值,所以在声明之前访问就为undefined。
- 那let和const不能访问,是不是let和const声明的变量没有在代码执行前被收集创建呢?到底let和const有没有作用域提升?
- 其实let和const声明的变量在代码执行前是有被收集创建的,只是不能访问而已,所以就不能称之为作用域提升,在ECMA262对let和const的描述中,这些变量会被创建在包含它们的词法环境被实例化时,但是是不可以访问它们的,直到词法绑定被求值(也就是变量被赋值之后);
- 在使用var声明的变量,是会添加到window上的,而let和const声明的变量是不会被添加到window上的,实际上是被添加到了变量环境中进行存储;
- 暂时性死区:在代码中,使用let、const声明的变量,在声明之前变量是不可以被访问的,这种现象称之为temporal dead zone(TDZ);
总结:在上面的代码中,其实message在代码执行前就已经被创建了,在用let进行修饰后,js底层会对其进行约束,以至于在声明前不可以访问。
1.4.模板字符串
ES6允许使用字符串模板来嵌入JS的变量或者表达式来进行拼接。
使用``来编写字符串,可以${expression}来嵌入动态内容,里面可以写一个表达式。
标签模板字符串:模板字符串另外一种用法,可以用来调用函数,如果使用标签模板字符串,并且在调用的时候插入其他的变量。
- 模板字符串被拆分了;
- 第一个元素是数组,元素为被
${}
的字符串组合; - 后面的元素是一个个
${}
中传入的变量值;
应用:在react中编写css就有这么一个库叫styled-components
,其原理就是使用的标签模块字符串。
1.5.函数的默认参数
在ES6之前,我们编写的函数参数是没有默认值的,而ES6给我们提供了默认参数,如果传入了该参数就使用传入的值,没有传入就使用默认值。
-
在ES6之前,如果想实现默认参数的效果,就必须编写以下最终代码。
-
在ES6中,可以在声明函数时给其参数默认值。
-
一般默认值写法:
-
默认值搭配解构的使用:
-
注意:有默认值的参数一般会放到最后,在JS中函数都会有一个length属性,length长度代表函数参数个数,但是有默认值的参数是不会被计算在内的。但是如果将有默认值的参数放在中间,那么后面的参数也不会被计算在内的。
1.6.函数的剩余参数
ES6中引用了剩余参数,可以将不定数量的参数放入到一个数组中,如果最后一个参数是以...为前缀的,那么它会将剩余的参数放入到该参数中,并且作为一个数组。
剩余参数和arguments有什么区别呢?
- 剩余参数只包含那些没有对应形参的实参,而arguments对象包含了传给函数的所有实参;
- arguments对象不是一个真正的数组,而rest是一个真正的数组,可以进行数组的所有操作;
- arguments是早期的ECMAScript中为了方便去获取所有的参数提供的一个数据结构,而剩余参数是ES6中提供并且希望代替arguments的;
1.7.箭头函数
相比于普通函数,箭头函数有一下几个特殊点:
- 箭头函数内部是不绑定this的,会去它上一层作用域中找;
- 箭头函数是没有显示原型的,所以不能作为构造函数,使用new操作符来调用;
- 箭头函数没有自己的argments;
1.8.展开语法
展开语法(spread syntax)可以在函数调用或数组构造是,将数组表示或者字符串在语法层面展开,还可以在构造字面量对象时,将对象表达式按键值对的方式展开。
展开语法的主要使用场景:在函数调用时和数组构造时使用:
1.9.数值的表示
ES6中规范了二进制和八进制的写法。
1.10.Symbol的使用
在ES6之前,对象属性名都是字符串形式,很容易造成属性名冲突,Symbol是ES6中新增的一个基本数据类型,可用来生成一个独一无二的值。
-
作为属性名:
-
作为属性值:
-
注意:Symbol作为属性名时,不能通过
.
方式来获取,也就是obj.s1
,只能通过obj[s1]
的方式获取。并且在通过Object.keys()
获取对象所有的key时,是获取不到这些Symbol的,可以借助Object.getOwnPropertySymbols()
来获取所有类型为Symbol的key。
延伸:Symbol的作用就是给我们创建一个独一无二的值,如果我们想创建一个相同的Symbol可以怎么做呢?
- 可以使用
Symbol.for()
来做到这一点; - 并且可以通过
Symbol.keyFor()
方法来获取对应的key;
1.11.Set和WeakSet的使用
在ES6之前,存储数据的结构主要有两种,分别是数组和对象。在ES6中新增了另外两种数据结构:Set、Map,以及它们另外形式的WeakSet、WeakMap。下面就先来看看Set和WeakSet。
(1)Set:用于保存数据,类似于数组,与数组不同的是Set中的元素是不能重复的。
-
Set的基本使用:
-
Set常见的属性:
-
size:返回Set中元素的个数;
-
-
Set常见的方法:
- add(value):添加一个元素,返回set对象本身;
- delete(value):从set中删除与value值相等的元素,返回boolean类型;
- has(value):判断set中是否存在value这个元素,返回boolean;
- clear():清空set中所有的元素,无返回值;
- forEach(callback,[thisArg]):遍历set对象(Set的实例化对象是一个可迭代对象,所以也支持for...of遍历);
(2)WeakSet:也要求内部元素不能重复。
-
WeakSet与Set的区别:
- 区别一:WeakSet中只能存放对象类型,不能存放基本数据类型;
- 区别二:WeakSet对元素的引用是弱引用,如果没有其他引用对该元素进行引用,是可以被GC回收的;
- 区别三:WeakSet由于是弱引用的原因,所以是不能进行遍历的,存储到WeakSet中的对象是没办法通过遍历获取的;
- 什么是弱引用?:简单理解就是对对象类型的引用是可以看成没有的,但是却可以访问其对象内部的数据;
-
WeakSet常见方法:add(value)、delete(value)、has(value),没有clear和forEach;
-
WeakSet的基本使用:
1.12.Map和WeakMap的使用
下面来讲讲Map和WeakMap,主要用于存储映射关系。
(1)Map:对于普通对象存储映射关系,只能使用字符串或者Symbol作为属性名,如果普通对象使用对象来作为key的话,会自动将对象转成字符串,但是Map允许我们使用对象作为key。
-
Map的基本使用:
-
Map常见的属性:
-
size:返回Map中元素的个数;
-
-
Map常见的方法:与Set很相似,设置和获取属性不太一样。
- set(key, value):在Map中添加key和value,并且返回整个map对象;
- get(key):根据key获取map中的value;
- has(key):判断map中是否包含某一个key,返回boolean值;
- delete(key):根据key删除一个键值对,返回boolean值;
- clear():清空所有的属性;
- forEach(callback, [thisArg]):遍历map(也可使用for...of遍历);
如果map使用for...of遍历,看一下遍历出来的值是什么样子的:
(2)WeakMap:也是以键值对的形式存在。
- WeakMap和Map的区别:与Set和WeakSet的区别类似;
- 区别一:WeakMap的key只能使用对象,不接受其他类型作为key;
- 区别二:WeakMap的key对对象的引用是弱引用,如果没有其他引用指向这个对象,那么GC可以回收该对象;
- 区别三:WeakMap和WeakSet一样也不能进行遍历;
- WeakMap常见的方法:set(key, value)、get(key)、has(key)、delete(key),没有clear和forEach;
2.ES7相关知识点
2.1.数组的includes方法
在ES7之前,判断数组中包含某一个元素,一般可以用indexOf判断是否为-1,ES7给我们提供了includes方法来判断数组中是否包含指定元素,返回boolean类型;
- valueToFind:需要查找的元素;
- fromIndex:从指定索引开始查找,如果from为负值,就从
array.length + fromIndex
的位置开始查找(默认值为0);
注意:includes方法是可以判断NaN是否存在的,因为includes的内部实现对NaN采用isNaN方法进行判断。
2.2.指数运算符
在ES7之前,计算数字的指数需要通过Math.pow方法来完成,在ES7中,增加了
**
运算符,可以来计算指数。
计算2的3次方:
3.ES8相关知识点
3.1.获取对象所有的value
我们知道可以使用Object.keys获取一个对象的所有key,ES8给我们提供了Object.values来获取所有的value值。
3.2.Object的entries方法
通过Object.entries()可以获取到一个二维数组,数组中会存放可枚举的键值对数组,数组元素分别为对象的key和value。
3.3.字符串的填充
如果需要对字符串进行前后填充,来实现某种展示格式,ES8中提供了padStart和padEnd方法,分别可以对字符串进行首位填充。
应用场景:字符串的填充可以用于对身份证、银行卡进行位数隐藏。
3.4.Object的getOwnPropertyDescriptors方法
Object.getOwnPropertyDescriptors()方法用来获取一个对象的所有自身属性的描述符。
4.ES9相关知识点
4.1.对象的展开语法
在前面讲了,数组是可以使用展开语法的,在ES9中,在构建对象字面量时,也可以使用展开语法了。
注意:对象的展开运算符只能实现浅拷贝,如果对象内部还包含引用类型的值,就会指向同一地址空间。
5.ES10相关知识点
5.1.flat和flatMap
(1)flat方法
按照一个可指定的深度递归遍历数组,并将所有的元素和遍历到的子数组合并为一个新数组返回。(可用于数组扁平化)
(2)flatMap方法
首先使用映射函数映射每个元素,然后将结果压缩成一个新数组。
- flatMap先进行map操作,然后做flat操作;
- flatMap中的flat操作深度为1;
5.2.Object的fromEntries方法
在前面讲了可以通过Object.entries()将一个对象转换成键值对数组,而Object.fromEntries()可以将键值对列表转换成对象。
应用场景:解析url的query部分,将其转成一个对象。
5.3.去除字符串首尾空格
去除一个字符串首尾空格可以通过trim()方法,而trimStart和trimEnd方法分别可以单独去除字符串前或后的空格。
5.4.Symbol的description
在前面讲了Symbol类型,在创建一个Symbol类型的值时,还可以传入指定的描述符。
6.ES11相关知识点
6.1.BigInt类型
在JavaScript中,如果数字过大,可能是不正确的,先看看JavaScript提供给我们的最大值和最小值是多少。
如果给最大值再加大数值,很明显数值是不正确的:
所以,ES11引入了新的数据类型BigInt,可用于表示很大的整数:
- BigInt的写法需要在数值后面加上
n
; - 只有数值同为BigInt类型才能进行运算(不能进行隐式转换),如果需要运算的数据不是BigInt类型就要加上
n
转成BigInt; - 也可使用
BigInt()
方法进行转类型;
6.2.空值合并操作符(??)
如果
||
不能对空字符串和0进行很好的判断,就可以使用??
。
6.3.可选链
可选链(Optional Chaining)的主要作用就是让代码在进行null和undefined判断时更加清晰和简洁,确保我们访问对象属性是安全的(因为从undefined里面取值是会报错的)。
6.4.globalThis
在ES11之前获取JavaScript的全局对象在不同的环境下的获取方式不同:
- 浏览器中:this、window获取;
- node中:global获取;
ES11中,对我们获取全局对象进行统一规范:
浏览器中:
node中:
7.ES12相关知识点
7.1.FinalizationRegistry
FinalizationRegistry对象可以让你在对象被垃圾回收时请求一个回调。
- FinalizationRegistry提供了这样的一种方法:当一个在注册表中注册的对象被回收时,请求在某个时间点上调用一个清理回调;(清理回调有时被称为 finalizer )
- FinalizationRegistry可实例化一个对象,可以借助该对象注册想要清理回调的对象,传入该对象和所含的值;
需要借助浏览器的GC来进行测试,当两个对象被真正回收了,就会调用清理回调,打印对应内容:
7.2.WeakRef
在前面讲了WeakSet和WeakMap中的元素对对象的引用都是弱引用,WeakRef就可以专门实现对一个对象进行弱引用,也就是说该对象被GC回收时,是不会看它是否有弱引用的,有没有弱引用一样被回收。
可以结合上面的FinalizationRegistry进行测试:
- WeakRef创建的弱引用需通过
deref()
来访问对象属性;
7.3.逻辑赋值运算
ES12为我们提供了三种逻辑赋值运算:
-
||=
:逻辑或赋值运算; -
&&=
:逻辑与赋值运算; -
??=
:逻辑空赋值运算;
注意:该新增特性可能过新,可能出现node版本不支持的情况,可以在浏览器中打印查看。
7.4.数值分隔符
当数值过长时,ES12允许我们使用
_
进行连接,方便阅读。
7.5.字符串替换
ES12提供了一个replaceAll方法,该返回一个新字符串,新字符串所有满足
pattern
的部分都已被replacement
替换。pattern
可以是一个字符串或一个RegExp,replacement
可以是一个字符串或一个在每次匹配被调用的函数。
将所有的a替换为b:
注意:该新增特性可能过新,可能出现node版本不支持的情况,可以在浏览器中打印查看。
总结:
本篇文字只总结了ES6-ES12部分简单知识点,还有一些其它ES6之后新增的特性,如Promise、迭代器、生成器、async、await等等,将会在后续的文章中进行整理。
__EOF__

本文链接:https://www.cnblogs.com/MomentYY/p/16047880.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix