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'}
// Map
const 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和flatMap
const arr = [1,2,3, [4,5, [6,7,8]]];
// flat()
// 作用 : 将多维数组转为 低维数组
console.log(arr.flat()); // [1, 2, 3, 4, 5] -> 二维数组转为一维数组
//将三维数组 转为1维数组 , 需要 flat(参数) 参数为 数组的深度 默认为1
console.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; // 初始化时候 也是 使用 #age
this.#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.#weight
girl.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);
对象可选链操作符
?.
对象的可选链操作符
// ?.
// 用于判断对象是否存在,如果存在,则执行, 不存在 返回 undefined
function main(config) {
// 获取 config.db.host
// 先判断config是否为空 再判断 config.db 是否为空 再进行config.db.host的赋值
// const dbHost = config && config.db && config.db.host // 这样子判断太麻烦了,
// 使用可选链, ?. 如果有执行后面, 如果没有 返回 undefined
const dbHost = config?.db?.host
console.log(dbHost); // 1.2.3.4
}
main({
db: {
host: '1.2.3.4',
username: 'root'
},
cache: {
host: '192.1.4.1',
username: 'admin',
}
})
新数字类型BigInt
// 大整形 BigInt
let 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)); // 9007199254740992n
console.log(BigInt(max) + BigInt(max)); // 8014398509481982n
绝对全局对象globalThis
// 绝对全局对象globalThis
console.log(globalThis);
// 使用浏览器时, 返回的全局对象是 window
// 使用 node 环境时 , 返回的全局对象就是 global