ES7新特性
// includes indexOf 查看数组元素 是否存在const arr = ['test1', 'test2', 'test3'];//判断console.log(arr.includes('test2'));console.log(arr.includes('test'));
//2. ** 计算次方 相当于 Math.pow()方法console.log(2 ** 10); // 2 的10次方console.log(Math.pow(2,10));
ES8 async 和 await 函数
async 和 await 两种语法结合可以让异步代码像同步代码一样
async函数
- async 函数的返回值是 promise 对象
- promise 对象的结果由 async 函数执行返回值决定
//实例 async 函数async function fn () {//情况1.// 返回一个字符串// return 'test'; // 返回结果为 Promise 对象// 只要 返回的结果 不是 Promise 对象, 则返回的结果就是一个成功的 Promise 对象// return;//2. 情况2// 抛出错误, 返回的结果是一个失败的 Promise// throw new Error('出错了');//3. 情况3// 如果返回结果是一个Promise对象return new Promise((resolve, reject) => {resolve('成功获取数据'); // 如果成功,返回成功的Promise// reject('获取数据失败'); // 如果失败,返回失败的Promise})}const result = fn(); // Promise {<fulfilled>: 'test'}// Promise {<rejected>: Error: 出错了// 如果成功,返回成功的Promise , 如果失败,返回失败的Promise// console.log(result);// 使用 then 方法 回调 , 基本和使用 Promise 一样result.then(value => {console.log(value)}, reason => {console.warn(reason)})
await 表达式
- await 必须写在async 中
- await 右侧的表达式一般为 promise 对象
- await 返回的是 promise 成功的值
- await 的 promise 失败了,就会抛出异常, 需用通过 try…catch 捕获处理
// 创建 Promise 对象
const p = new Promise((resolve, reject) => {
// resolve(‘成功获取数据’); // 成功时候
reject(‘失败的调用’);
})
// await 要放在 async 函数中async function main () {// await 右侧的表达式一般为 promise 对象// 成功获取时// let result = await p;// console.log(result); // 返回成功的数据// 获取失败时try {let result = await p;}catch (e) {console.log(e);}}main();
async和await结合读取数据
const fs = require('fs');// fs 读取文件 是一个 异步调用方法function readFile1() {// 此函数返回值 是一个 Promise 对象return new Promise((resolve, reject) => {fs.readFile('./result/test.md', (err, data) => {// 如果失败if (err) reject(err);resolve(data);})})}function readFile2() {// 此函数返回值 是一个 Promise 对象return new Promise((resolve, reject) => {fs.readFile('./result/test2.md', (err, data) => {// 如果失败if (err) reject(err);resolve(data);})})}function readFile3() {// 此函数返回值 是一个 Promise 对象return new Promise((resolve, reject) => {fs.readFile('./result/test3.md', (err, data) => {// 如果失败if (err) reject(err);resolve(data);})})}// 声明一个 async 函数async function main () {// 读取内容// let test = readFile1(); // 异步情况, 如果没有使用await,则返回 [object Promise]let test = await readFile1();let test2 = await readFile2();let test3 = await readFile3();console.log(test.toString());console.log(test2.toString());console.log(test3.toString());}main();
async和await结合发送Ajax请求
// 发送请求, 返回结果是 Promise 对象function sendAjax(url) {// 在这里就 返回 Promise 对象return new Promise((resolve, reject) => {// Ajax发送请求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); // 失败}}}})}//测试1. 使用 Promise 的then 方法 测试// sendAjax('https://autumnfish.cn/api/joke').then(value => {// console.log(value)// }, reason => {// console.log(reason);// })//测试2. 使用 async 和 await 方法async function main () {const result = await sendAjax('https://autumnfish.cn/api/joke')const xiaohua = await sendAjax('https://autumnfish.cn/api/joke/list?num=2');console.log(result);console.log(xiaohua);}main();
ES8 对象方法的扩展
// 声明对象const school = {name: 'Yellowsea',className: ['test', 'test2','test3'],techers: ['1','2','3'],}//对象的扩展方法//1. Object.keys() 获取所有的键console.log(Object.keys(school));//2. Object.values() 获取所有的值console.log(Object.values(school));//3. Object.entries() 获取所有的键值对 , 返回一个数组, 数组元素为 键值对 的数组console.log(Object.entries(school)); // [Array(2), Array(2), Array(2)]// 方便使用 Map() 方法const m = new Map(Object.entries(school));console.log(m);console.log(m.get('className'));//4. Object.getOwnPropertyDescriptors()// 对象属性的描述对象console.log(Object.getOwnPropertyDescriptors(school));// 就是对象属性的配置 (创建对象的底层)const obj = Object.create(null, {// 这里写的就是对象属性的描述name : {value: 'Yellowsea',// 可写 可修改删除 可枚举writable: true,configurable: true,enumerable: true}})console.log(obj); // {name: 'Yellowsea'}
ES9对象展开-扩展运算符
Rest 参数 spread 扩展运算符 在 ES6 中已经引入, 不过ES6 中只针对数组
在ES9 中为对象提供了像数组一样的rest 参数 和 扩展运算符
实例
function connect({host, port, ...username}) { // ...username 对 username 后面的数据进行压缩到一个数组// 输出console.log(host, port,username);// localhost 3306 {username: 'test', password: 'test'}}connect({host: 'localhost',port: 3306,username: 'test',password: 'test',type: 'utf-8',})//2. 对象合并 ...let obj1= {name1: 'obj1',}let obj2= {name2: 'obj2'}let obj3= {name3: 'obj3'}// 对象合并// ...obj 展开 对象中的数据const result = {...obj1,...obj2,...obj3}console.log(result)
ES10
对象扩展方法Object.fromEntries
// 二维数组// Object.fromEntries() 接收一个二维数组 , 将二维数组 转为 键|值形式const result = Object.fromEntries([['name', 'yellowsea'],['test', 'test,test,test']])console.log(result);// {name: 'yellowsea', test: 'test,test,test'}// Mapconst m = new Map(); // 新的数据结构, 可以通过 Map属性, 对Map进行操作m.set('name', 'Yellowsea'); // 添加属性const res = Object.fromEntries(m);console.log(res, typeof res); // {name: 'Yellowsea'} object// Object.fromEntries() 方法 将数组转为一个对象// ES8 中 Object.Entries 方法将 对象 转为 数组(二维数组) // 相反的关系const obj2 = {name: 'yellowsea',test: 'test'}const res2 = Object.entries(obj2);console.log(res2); // [Array(2), Array(2)]const res3 = Object.fromEntries(res2);console.log(res3); // {name: 'yellowsea', test: 'test'}
ES10字符串方法trimStart和trimEnd方法
// 之前就有 trim 方法 去除字符串两边的空格const str = ' hello ';console.log(str.trim()); // hello// trimStart() 去除字符串 前边的空格console.log(str.trimStart());// trimEnd() 去除字符串 后面的空格console.log(str.trimEnd());
数组方法flat和flatMap
// ES10数组方法flat和flatMapconst arr = [1,2,3, [4,5, [6,7,8]]];// flat()// 作用 : 将多维数组转为 低维数组console.log(arr.flat()); // [1, 2, 3, 4, 5] -> 二维数组转为一维数组//将三维数组 转为1维数组 , 需要 flat(参数) 参数为 数组的深度 默认为1console.log(arr.flat(2)); // [1, 2, 3, 4, 5, 6, 7, 8]// flatMap()// 也是将多维数组转为低维数组//用法 : 在使用Map进行循环运算时 计算过程中返回具有二维数组, 使用 flatMap() 可以对数组降维const arr2 = [1,2,3,4];//使用 map() 循环时 , 没有使用 flatMap()const result1 = arr2.map(item => [item * 10] );console.log(result1); // [[10], [20], [30], [40]]// 使用 flatMap() 对数组降维const result2 = arr2.flatMap(item => [item * 10]) // 能够降维console.log(result2); // [10, 20, 30, 40]
Symbol.prototype.description直接获取Symbol属性值
// Symbol.prototype.description直接获取Symbol属性值const s = Symbol('这是Symbol属性')console.log(s.description); // 这是Symbol属性
ES11
Class类私有属性
// 私有属性class Person {//共有属性name;// 私有属性#age; // 使用 #变量 定义私有属性#weight;constructor(name, age, weight) {this.name = name;this.#age = age; // 初始化时候 也是 使用 #agethis.#weight = weight;}// 内部方法intro() {console.log(this.name);console.log(girl.#age)console.log(girl.#weight)}}// 对象 实例化const girl = new Person('小红', 12, '12kg');// console.log(girl.name) // 查看属性// console.log(girl.#age) // 报错, 无法通过实例化对象查看 私有属性// console.log(girl.#weightgirl.intro(); // 可以成功访问
Promise.allSettled方法
Promise.allSettled(), 参数接收一个数组, 数组中元素必须是一个 Promise 对象
Promise.allSettled() 返回数据也是一个Promise对象, 返回值始终是一个成功的Promise,值数组中Promise的返回值
// 声明两个 Promise 对象const p1 = new Promise((resolve, reject) => {setTimeout(()=> {resolve('p1成功');}, 1000)})const p2 = new Promise((resolve, reject) => {setTimeout(()=> {// resolve('p2成功');reject('p2失败')}, 1000)})// 调用 allSettled 方法const result = Promise.allSettled([p1,p2]); // 传入的参数必须是 数组console.log(result);// 跟 allSettled 方法相似的 all() 方法// all() 方法 接收也是一个数组,// 区别是:数组Promise元素,如果有一个出错,返回结果返回就是 失败的状态 。 必须是Promise的状态全部成功,才返回成功const showResult = Promise.all([p1,p2]);console.log(showResult);
对象可选链操作符
?. 对象的可选链操作符
// ?.// 用于判断对象是否存在,如果存在,则执行, 不存在 返回 undefinedfunction main(config) {// 获取 config.db.host// 先判断config是否为空 再判断 config.db 是否为空 再进行config.db.host的赋值// const dbHost = config && config.db && config.db.host // 这样子判断太麻烦了,// 使用可选链, ?. 如果有执行后面, 如果没有 返回 undefinedconst dbHost = config?.db?.hostconsole.log(dbHost); // 1.2.3.4}main({db: {host: '1.2.3.4',username: 'root'},cache: {host: '192.1.4.1',username: 'admin',}})
新数字类型BigInt
// 大整形 BigIntlet n = 123n;console.log(n, typeof n); // 123n 'bigint'// 使用 BigInt 将 一个整形的数字转为 BigInt 类型// BigInt() 只能接收 整形, 不能接收 Float 类型let n1 = 123;console.log(BigInt(n1)); // 123n// BigInt 类型数, 运算let max = Number.MAX_SAFE_INTEGER;console.log(max);console.log(max + 1)console.log(max + 2)console.log(max + 3)// BigInt运算console.log(BigInt(max) + BigInt(1)); // 9007199254740992nconsole.log(BigInt(max) + BigInt(max)); // 8014398509481982n
绝对全局对象globalThis
// 绝对全局对象globalThisconsole.log(globalThis);// 使用浏览器时, 返回的全局对象是 window// 使用 node 环境时 , 返回的全局对象就是 global
