前言
ES6 入门教程 - ECMAScript 6入门 (ruanyifeng.com)
尚硅谷Web前端ES6教程,涵盖ES6-ES11_哔哩哔哩_bilibili
一、ES6模块化
1.1 如何导出
方法一:加上export关键字
export let school = '中国地质大学';export function teach() {console.log("是一所大学")}
<script type="module">/*不用src*///引入js文件import * as m1 from "./14_modules.js";console.log(m1)console.log(m1.school)m1.teach()</script>
方法二:export对象暴露
let school = '中国地质大学';function findjob() {console.log("是一所大学")}export {school,findjob}
<script type="module">/*不用src*///引入js文件import * as m2 from "./15_modules2.js";console.log(m2)console.log(m2.school)m2.findjob()</script>
方法三:默认default暴露
export default {school: '中国地质大学',hello: function () {console.log("是一所大学")}}
<script type="module">/*不用src*///引入js文件import * as m3 from "./16_modules3.js";console.log(m3)// console.log(m3.school)// m3.teach()console.log(m3.default.school)m3.default.hello();</script>
默认暴露使用default方法来使用暴露的对象和方法
1.1 如何导入
<script type="module">//(1)通用的导入方式import * as m1 from "./14_modules1.js";console.log(m1.school,m1.teach);//(2)解构赋值形式import {school, teach} from "./14_modules1.js";console.log(school)teach();//使用别名,避免重名import {school as school1, findjob} from "./15_modules2.js";console.log(school1)findjob();//默认暴露,将default属性起别名import {default as m3} from "./16_modules3.js"console.log(m3.school,m3.hello)//(3)简便形式,针对默认暴露import m4 from "./16_modules3.js";console.log(m4.school,m4.hello)</script>
1.2 ES6打包
需求:
将src目录下js文件夹内所有js文件进行打包
步骤:
① 安装工具 babel-cli babel-preset-env browserify(webpack)
npm init --yesnpm i babel-cli babel-preset-env browserify -Dnpx babel src/js -d dist/js --presets=babel-preset-env
② 打包
npx browserify dist/js/app.js -o dist/bundle.js
③ 项目结构

④ 测试引入打包后的js
<!--<script src="dist/js/app.js" ></script>--><script src="dist/bundle.js" ></script>
注意:
使用 npx 是因为babel不是全局安装,如果全局安装则使用npm
src目录下的是需要被打包的目录,dist目录下的是打包之后的目录
这里使用的是browserify打包工具,而不是webpack。因为webpack比较重量级适合于项目,且需要配置
1.3 npm安装jQuery
需求:
npm安装jQuery包,然后修改页面背景颜色
步骤:
① 安装jQuery
npm i jquery //注意大小写
② 导入包
//修改背景颜色为粉色import $ from 'jquery' ; // const $ = require("jQuery");$('body').css('background','pink')
③ 打包文件
(看上一目录如何打包)
二、 ES7新特性
2.1 Array.prototype.includes
该方法用于检测数组中是否包含某个元素,返回布尔类型
const dx = ['中国地质大学','中国石油大学','中国矿业大学','中国海洋大学'];console.log(dx.includes('中国地质大学')) //trueconsole.log(dx.includes('中国农业大学')) //false
注意:之前有index方法判断,但是是返回位置下标,没有返回-1
2.2 指数操作符
「**」,用来实现幂运算,功能与Math.pow结果相同
console.log(3 ** 4) //81=3^4console.log(4 ** 2) //16=4^2
三、ES8新特性
3.1 async函数
基本概念
1)async 函数的返回值为promise对象
2)promise对象的结果由async函数执行的返回值决定
返回值类型:
非Promise对象
//async 函数async function fn() {return '中国地质大学';}const res = fn();console.log(res)

只要返回的结果不是一个Promise类型的对象,则返回的Promise的状态一定是fulfilled
Promise对象
//async 函数async function fn() {return new Promise((resolve, reject) => {reject('失败的');});}const res = fn();res.then(value => {console.log(value);},reason => {console.warn(reason);})

如果返回的结果是一个Promise对象,则返回的Promise的状态由async函数返回的Promise状态决定。
3.2 await表达式
基本概念
1)await 必须写在 async 函数中;
2)await 右侧的表达式一般为 promise 对象;
3)await 返回的是 promise 成功的值;
4)await 的 promise 失败了, 就会抛出异常, 需要通过 try…catch 捕获处理;
const p = new Promise((resolve, reject) => {// resolve("用户数据!");reject("诶呀怎么失败了")})async function fn() {try {let result = await p; // await 返回的是 promise 成功状态时候的值console.log(result);}catch (e) {console.log(e);}}fn();
3.3 async与await结合读取文件
// 1. 引入fs模块const fs = require("fs");// 2. 封装读取文件的函数function readTxt1(url) {return new Promise((resolve, reject) => {fs.readFile(url, (err, data) => {if (err) {reject(err)}resolve(data);})})}// 3.async函数async function main() {let t1 = await readTxt1("./resource/content1.txt");let t2 = await readTxt1("./resource/content2.txt");let t3 = await readTxt1("./resource/content3.txt");console.log(t1.toString())console.log(t2.toString())console.log(t3.toString())}// 4.调用async函数main()
3.4 async与await结合发送AJAX
提供服务
const express = require("express");const app = express();app.get('/server', (req, res) => {//设置响应头 设置允许跨域res.setHeader("Access-control-allow-origin", "*");//设置响应体res.send("hello ajax");});app.listen('8000', () => {console.log("http://localhost:8000")});
封装Promise函数
function sendAjax(url) {return new Promise((resolve, reject) => {// 1.创建对象const xhr = new XMLHttpRequest();// 2.初始化xhr.open('GET', url);// 3.发送xhr.send();// 4.事件监听xhr.onreadystatechange = function () {if (xhr.readyState === 4) {if (xhr.status >= 200 && xhr.status < 300) {resolve(xhr.response);} else {reject(xhr.status);}}}})}
🚩函数返回值:
① 通过Promise的then方法
const res = sendAjax("http://localhost:8000/server");console.log(res); //这是一个promise对象res.then(value=>{console.log(value)})
② 通过async和await方法
async function main() {const res = await sendAjax("http://localhost:8000/server");console.log(res);}main();
3.5 ES8对象方法扩展
1、Object.values() 和 Object.entries()
const school = {name: "中国地质大学",cities: ['北京', '武汉'],teach: function () {console.log("传道受业解惑")}}//获取所有的键,返回数组console.log(Object.keys(school))//获取所有的值,返回数组console.log(Object.values(school))//获取键值对数组console.log(Object.entries(school))const m = new Map(Object.entries(school)) //转换成map集合console.log(m)
2、Object.getOwnPropertyDescriptors()
//获取对象属性的描述对象console.log(Object.getOwnPropertyDescriptors(school))

什么是属性描述? 可写、可配置、可枚举
const obj = Object.create(null,{name:{//属性值value:'地大',//属性特性writable:true,configurable:true,enumerable:true}});console.log(Object.getOwnPropertyDescriptors(obj))
四、ES9新特性
4.1 Rest 参数与 spread 扩展运算符
Rest 参数与 spread 扩展运算符在 ES6 中已经引入,不过 ES6 中只针对于数组,在 ES9 中为对象提供了像数组一样的 rest 参数和扩展运算符;
4.1.1 rest参数
之前
function connect({host, port, username, password}) {console.log(host)console.log(port)console.log(username)console.log(password)}connect({host: '127,0,0,1',port: 3306,username: 'root',password: 'root1234'});
ES9 扩展运算符
function connect2({host, port, ...user}) {console.log(host)console.log(port)console.log(user)}connect2({host: '127,0,0,1',port: 3306,username: 'root',password: 'root1234',type: 'master'});

4.1.2 扩展运算符
const ms = {q: '天音波',w: '金钟罩',}const ms2 = {e: '催筋断骨',r: '神龙摆尾'}const xz = {...ms, ...ms2}console.log(xz)

4.2 正则扩展:命名捕获分组
ES9 允许命名捕获组使用符号『?』,这样获取捕获结果可读性更强;
之前
//声明一个字符串let str = '<a href="https://www.baidu.com">百度</a>';//提取url和标签文本const reg = /<a href="(.*)">(.*)<\/a>///执行,获得一个数组const res = reg.exec(str)console.log(res);

之后
let str = '<a href="https://www.baidu.com">百度</a>';//?<str1> 这个名字可以随意取const reg = /<a href="(?<str1>.*)">(?<str2>.*)<\/a>/const res = reg.exec(str)console.log(res)console.log(res.groups.str1)console.log(res.groups.str2)

4.3 正则扩展:反向断言
ES9 支持反向断言,通过对匹配结果前面的内容进行判断,对匹配进行筛选;
let str = "JS5201314你知道么555啦啦啦"; // 需求:我们只想匹配到555// 正向断言 ?=const reg = /\d+(?=啦)/; // 前面是数字后面是啦const result = reg.exec(str);console.log(result);// 反向断言 ?<=const reg1 = /(?<=么)\d+/; // 后面是数字前面是么const result1 = reg1.exec(str);console.log(result1);

4.4 正则扩展:dotAll
正则表达式中点.匹配除回车外的任何单字符,标记『s』改变这种行为,允许行终止符出现;
<script>//dot . 元字符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;let data = [];while (result = reg.exec(str)) {console.log(result);data.push({title: result[1], time: result[2]});}console.log(data);</script>
