ES7
Array.prototype.includes
Includes 方法用来检测数组中是否包含某个元素,返回布尔类型值 存在返回true,不存在返回false
const mingzhu = ['西游记','红楼梦','三国演义','水浒传'];
console.log(mingzhu.includes('西游记'));
console.log(mingzhu.includes('从百草园到三味书屋'));
指数操作符
在 ES7 中引入指数运算符「**」,用来实现幂运算,功能与 Math.pow 结果相同
console.log(2 ** 10);
console.log(Math.pow(2,10));
ES8新特性
async 和 await
async 和 await 两种语法结合可以让异步代码像同步代码一样
async 函数
- async 函数的返回值为 promise 对象,
- promise 对象的结果由 async 函数执行的返回值决定
【return类型1——返回结果不是一个Promise类型】
async function fn(){
return '果粒陈';
}
const result = fn();
console.log(result);
【返回类型2——返回结果是一个失败的Promise】
async function fn(){
throw new Error('出错啦');
}
const result = fn();
console.log(result);
【返回类型3——返回一个Promise对象】(这种情况居多)
async function fn(){
return new Promise((resolve,reject)=>{
resolve('成功的数据');
});
}
const result = fn();
console.log(result);
async function fn(){
return new Promise((resolve,reject)=>{
reject('失败的错误');
});
}
const result = fn();
console.log(result);
await表达式
- await 必须写在 async 函数中
- await 右侧的表达式一般为 promise 对象
- await 返回的是 promise 成功的值
- await 的 promise 失败了, 就会抛出异常, 需要通过 try…catch 捕获处理
const p = new Promise((resolve,reject) => {
resolve("用户数据");
});
async function main(){
let result = await p;
console.log(result);
}
main();
const p = new Promise((resolve,reject) => {
reject("失败啦!!!");
});
async function main(){
try {
let result = await p;
console.log(result);
} catch (e) {
console.log(e);
}
}
main();
async和await结合读取文件
const fs = require("fs");
function readWeiXue() {
return new Promise((resolve, reject) => {
fs.readFile("./resources/为学.md", (err, data) => {
if(err){
reject(err);
}
resolve(data);
});
});
}
function readChaYang() {
return new Promise((resolve, reject) => {
fs.readFile("./resources/插秧诗.md", (err, data) => {
if(err){
reject(err);
}
resolve(data);
});
});
}
function readGuanShu() {
return new Promise((resolve, reject) => {
fs.readFile("./resources/观书有感.md", (err, data) => {
if(err){
reject(err);
}
resolve(data);
});
});
}
async function main(){
let weixue = await readWeiXue();
let ChaYang = await readChaYang();
let GuanShu = await readGuanShu();
console.log(weixue.toString());
console.log(ChaYang.toString());
console.log(GuanShu.toString());
}
main();
async和await封装AJAC请求
function sendAjax(url) {
return new Promise((resolve, reject) => {
const x = new XMLHttpRequest();
x.open('GET', url);
x.send();
x.onreadystatechange = function () {
if (x.readyState === 4) {
if (x.status >= 200 && x.status < 300) {
resolve(x.response);
}else{
reject(x.status);
}
}
}
});
}
sendAjax('接口').then(value=>{
console.log(value);
},reason=>{
});
async function main(){
let result = await sendAjax("接口地址");
console.log(result);
}
对象方法扩展
const school ={
name:'果粒陈',
citys:['北京','上海','深圳'],
xueke:['前端','java','大数据','运维'],
}
console.log(Object.keys(school));
Object.values()
Object.values()方法返回一个给定对象的所有可枚举属性值的数组
const school ={
name:'果粒陈',
citys:['北京','上海','深圳'],
xueke:['前端','java','大数据','运维'],
}
console.log(Object.values(school));
Object.entries()
Object.entries()方法返回一个给定对象自身可遍历属性 [key,value] 的数组,方便创建一个map
const school ={
name:'果粒陈',
citys:['北京','上海','深圳'],
xueke:['前端','java','大数据','运维'],
}
console.log(Object.entries(school));
const m = new Map(Object.entries(school));
console.log(m);
Object.getOwnPropertyDescriptors
该方法返回指定对象所有自身属性的描述对象
const school ={
name:'果粒陈',
citys:['北京','上海','深圳'],
xueke:['前端','java','大数据','运维'],
}
console.log(Object.getOwnPropertyDescriptors(school));
const obj = Object.create(null,{
name:{
value:'果粒陈',
writable:true,
configurable:true,
enumerable:true,
}
});
ES9新特性
Rest/Spread 属性
Rest 参数与 spread 扩展运算符在 ES6 中已经引入,不过 ES6 中只针对于数组, 在 ES9 中为对象提供了像数组一样的rest 参数和扩展运算符
reset参数:
function connect({host,port,...user}){
console.log(host);
console.log(port);
console.log(user);
}
connect({
host:'127.0.0.1',
port:'3306',
username:'cxj',
password:'123456'
})
扩展运算符对对象的操作: 它能够将对象展开,形成参数的序列
const skillOne = {
q:'天音波'
}
const skillTwo = {
w:'金钟罩'
}
const skillThree = {
e:'铁布衫'
}
const skillFour ={
r:'天雷破'
}
const result = {...skillOne,...skillTwo,...skillThree,...skillFour};
console.log(result);
正则扩展
正则命名捕获分组
ES9 允许命名捕获组使用符号?<name> ,这样获取捕获结果可读性更强
【用正则捕获】
let str = '<a href="http://www.cxj.com">果粒陈</a>';
const reg = /<a href="(.*)">(.*)<\/a>/;
const result = reg.exec(str);
console.log(result);
console.log(result[1]);
console.log(result[2]);
【分组】
let str = '<a href="http://www.cxj.com">果粒陈</a>';
const reg = /<a href="(?<url>.*)">(?<text>.*)<\/a>/;
const result = reg.exec(str)
console.log(result);
反向断言
ES9 支持反向断言,通过对匹配结果前面的内容进行判断,对匹配进行筛选。 【正向断言】根据匹配结果后面的内容进行判断
let str = '345oiuf89754果粒陈';
const reg =/\d+(?=果)/;
const result = reg.exec(str);
console.log(result);
【反向断言】根据匹配结果后面的内容进行判断
const reg = /(?<=f)\d+/;
const result = reg.exec(str);
console.log(result);
dotAll模式
dot 本身有. 的意思,. 指的是正则中的元字符 正则表达式中. 表示除回车外的任何单字符。模式修正符s ,加了它之后,. 将能够匹配任意字符,包含换行符。
【单个匹配】
let str = `
<ul>
<li>
<a>肖生克的救赎</a>
<p>上映日期: 1994-09-10</p>
</li>
<li>
<a>阿甘正传</a>
<p>上映日期: 1994-07-06</p>
</li>
</ul>`;
const reg = /<li>.*?<a>(.*?)<\/a>.*?<p>(.*?)<\/p>/s;
const result = reg.exec(str);
console.log(result);
【多个匹配】加上模式修正符g (全局匹配),然后遍循环输出
let str = `
<ul>
<li>
<a>肖生克的救赎</a>
<p>上映日期: 1994-09-10</p>
</li>
<li>
<a>阿甘正传</a>
<p>上映日期: 1994-07-06</p>
</li>
</ul>`;
const reg = /<li>.*?<a>(.*?)<\/a>.*?<p>(.*?)<\/p>/gs;
let result
while (result = reg.exec(str)) {
console.log(result);
}
ES10新特性
Object.fromEntries
用来创建一个对象。它的参数比较特殊,它接收一个二维数组或者一个map。
【接收二维数组】
const result = Object.fromEntries([
['name','果粒陈'],
['xueke','Java,大数据,前端']
]);
console.log(result);
【接收map】
const m = new Map();
m.set('name','cxj');
m.set('city','北京,上海,广州')
const result = Object.fromEntries(m);
console.log(result);
trimStart 和 trimEnd
ES5中字符串本身就已经有一个方法——trim ,它用来清除字符串两侧的空白字符。 ES中的trimStart 和trimEnd 用来指定清除左侧或右侧的空白字符
let str = ' jiofev ';
console.log(str);
console.log(str.trimStart());
console.log(str.trimEnd());
Array.prototype.flat 与 flatMap
flat 多维数组转换为低纬数组【不带参数,默认深度为1】
const arr = [1,2,3,4,[5,6]];
console.log(arr.flat());
const arr1 = [1,2,3,4,[5,6,[7,8,9]]];
console.log(arr1.flat(2));
flatMap 把Map的结果做一个维度降低
const arr = [1,2,3,4];
const result = arr.flatMap(item => [item*10]);
console.log(result);
Symbol.prototype.description
用来获取Symbol的字符串描述
const s = Symbol('果粒陈');
console.log(s.description);
ECMASript 11 新特性
类的私有属性
class Person{
name;
#age;
#weight;
constructor(name,age,weight){
this.name = name;
this.#age = age;
this.#weight = weight;
}
intro(){
console.log(this.name);
console.log(this.#age);
console.log(this.#weight);
}
}
const girl = new Person('小红',20,100);
console.log(girl);
console.log(girl.name);
girl.intro();
Promise.allSettled和Promise.all
该方法接收一个Promise的数组,返回的结果是一个Promise对象。但是返回的结果永远是成功的状态额,而且成功的值是里面每一个Promise的状态和结果。
const p1 = new Promise((resolve,reject)=>{
setTimeout(() => {
resolve("商品数据-1");
}, 1000);
});
const p2 = new Promise((resolve,reject)=>{
setTimeout(() => {
resolve("商品数据-2");
}, 1000);
});
const result = Promise.allSettled([p1,p2]);
console.log(result);
const p1 = new Promise((resolve,reject)=>{
setTimeout(() => {
resolve("商品数据-1");
}, 1000);
});
const p2 = new Promise((resolve,reject)=>{
setTimeout(() => {
reject("出错啦");
}, 1000);
});
const result = Promise.allSettled([p1,p2]);
console.log(result);
Promise.all 和上面的方法很像,不同的是他返回的结果要根据里面每一个Promise的状态决定。如果他们都成功,它才会成功。反之,则Promise.all返回的Promise就是失败的
String.prototype.matchAll
该方法用来得到正则批量匹配的结果【在正则匹配提取数据方面很有用】
let str = `<ul>
<li>
<a>肖生克的救赎</a>
<p>上映日期: 1994-09-10</p>
</li>
<li>
<a>阿甘正传</a>
<p>上映日期: 1994-07-06</p>
</li>
</ul>`;
const reg = /<li>.*?<a>(.*?)<\/a>.*?<p>(.*?)<\/p>/sg
const result = str.matchAll(reg);
const arr = [...result];
console.log(arr);
可选链操作符
可选链操作符,是?. 的组合。当应对对象类型的参数的时候,对象的层级比较深,有了可选链操作符之后,就不用做层级的判断了。
function main(config){
const dbHost = config?.db?.host;
console.log(dbHost);
}
main({
db: {
host:'192.168.1.100',
username: 'root'
},
cache: {
host: '192.168.1.200',
username:'admin'
}
})
动态 import 导入
在入口文件动态引入,也就是用的时候再引入。例如下面的入口文件:
const btn = document.getElementById('btn');
btn.onclick = function(){
import('./hello.js').then(module => {
module.hello();
});
}
BigInt类型
BigInt,大整型。主要用来更大的数值运算
let n = 521n;
console.log(n,typeof(n));
let n1 = 123;
console.log(BigInt(n1));
let n2 = 1.2;
console.log(BigInt(n2));
【运算】
let max = Number.MAX_SAFE_INTEGER;
console.log(max);
console.log(max+1);
console.log(max+2);
console.log(BigInt(max));
console.log(BigInt(max)+BigInt(1));
console.log(BigInt(max)+BigInt(2));
globalThis
globalThis是ES11引入的一个特殊变量,它是一个全局的this。 它始终指向全局对象,无论执行环境是什么。
|