ES6-ES11
Author:gavin,本文是尚硅谷ES学习集体笔记
视频链接
ES6
P2-什么是 ES6?
P3-let 变量成名及个性
- 不能反复申明
- 块级作用域
- 不存在变量晋升,在申明前写无用
- 不影响作用链
P4-let 练习
P5-const 申明常量及特点
- 肯定要赋初始值
- 个别常量应用大写
- 常量值不能批改(个别用数组,对象)
- 块级作用域
P6-解构赋值
// 1.数组解构const F4 = ["小明", "小红", "小亮", "小白"];let [mk, hs, ll, bd] = F4;// 2.对象解构const ming = { name: "小明", age: "18",};let { name, age } = ming;
P7-模板字符串
// 1.申明let str = `I am string`;// 2.内容可间接呈现换行符let str = `<span>isString</span>`;// 3.变量拼接let lovest = "刘德华";let out = `${lovest}是我的偶像`;
P8-对象简写办法
let name = '小明',let age = 18,const person={ name, age, improve(){ console.log('我能工作') }}
P9-箭头函数及申明
// 申明let fn = function () {};let fn = (a, b) => { return a + b;};// 调用fn(a, b);// 1. this始终指向所在作用域下的 this 的值// 2. 不能作为结构实例对象办法let Person = (name, age) => { this.name = name; this.age = age;};let me = new Person("xiaoming", 20);// 3. 不能应用 arguments 变量let fn = () => { console.log(arguments);};fn(1, 2, 3);// 4. 箭头函数简写// 形参惟一,可省略小括号// 代码体一句,省略花括号,此时return必须省略,且语句执行后果即返回值let pow = (n) => n * n;
P10- 箭头函数利用场景
// 1. 定时器回调,应用作用域this// 2. 从数组中返回偶数元素const arr = [1, 5, 6, 7, 652];const result = arr.filter((item) => item % 2 === 0);console.log(result);// 适宜与this 无关回调,定时器、数组办法回调// 不适宜与 this 无关的回调,事件回调、对象的办法
P11- 函数参数默认值设置
// 1. 形参初始值,有默认值的参数,地位要靠后(潜规则)add(a,b,c=10){ return a + b + c;}let result add(1,2);// 2. 与解构赋值联合function connect({ host = "127.0.0.1", username, password, port }) { console.log(host); console.log(username); console.log(password); console.log(port); } connect({ username: "root", password: "root", port: 3306, });
P12- rest 参数
// ES5获取实参function date() { console.log(arguments);}date("ming", "gavin", "lily");// rest参数必许放到参数最初function date(a, b, ...args) { console.log(args); //数组}date(1, 2, 3, 4, 5, 6);
P13-P14 扩大运算符介绍及使用
"..."扩大运算符能将"数组"转化为"参数序列"
// 1. 数组合并const arr = [1, 2, 3, 4, 5];const fh = ["增益", "零花"];const he = [...arr, ...fh];console.log(he);// 2. 数组的克隆const szh = ["E", "G"];const syc = [...szh];console.log(syc);//3. 将伪数组转为真正数组const divs = document.querySelectorAll("div");const divArr = [...divs];console.log(divArr);
P15-Symbol 的介绍与创立
js 的第七种类型,用来解决命名抵触
// 创立Symbollet s = Symbol();let s2 = Symbol("gavin");let s3 = Symbol("gavin");console.log(s2 === s3);let s4 = Symbol.for("gavin");console.log(s4, typeof s4);// 不能与其余数据进行计算// let result = s + s;// USONB// u undefined// s String Symbol// o Object// n null Number// b Boolean
P16-Symbol 的使用
const game = { up() { console.log("up!"); }, down() { console.log("down"); },};// First:向一对象内部增加Symbol;let methods = { up: Symbol(), down: Symbol(),};game[methods.up] = () => { console.log("Up To");};game[methods.down] = () => { console.log("Down to");};console.log("game对象", game);// Second:外部定义Symbollet steam = { name: "狼人杀", [Symbol("say")]: () => { console.log("I can Say!"); }, [Symbol("run")]: () => { console.log("Run to world"); },};console.log("steam", steam);
P17-Symbol 的内置属性(不罕用)
P18-19 迭代器介绍???
// 迭代器遍历对象原理const four = ["唐僧", "孙悟空", "沙僧"];let iterator = four[Symbol.iterator]();// console.log(iterator.next());// 申明对象const myclass = { name: "高一一班", studensts: ["ming", "ling", "星星"], [Symbol.iterator]() { // 索引变量 let index = 0; let _this = this; return { next: function () { if (index < _this.studensts.length) { const result = { value: _this.studensts[index], done: false }; // 下标自增,返回后果 index++; return result; } else { return { value: undefined, done: true }; } }, }; },};//遍历对象且为students成员for (let v of myclass) { console.log(v);}
P20-生成器函数申明和调用
// 生成器是一个非凡的函数// 异步编程、纯回调函数、node fs ajax mongodbfunction* gen() { yield "一只羊"; yield "两只羊"; yield "三只羊";}// let iterator = fen();for (let v of gen()) { console.log(v);}
P21-生成器函数的参数传递
function* gen(arg) { console.log(arg); let one = yield 111; console.log(one); let two = yield 222; console.log(two); let three = yield 333; console.log(three);}// 执行获取迭代器对象let iterator = gen("AAA");console.log(iterator.next());// next办法可传实参console.log(iterator.next("BBB"));console.log(iterator.next("CCC"));console.log(iterator.next("DDD"));
P22-P23 生成器函数实例
//异步编程 文件操作 网络操作 数据库操作// 需要:1s后输入111、2s后输入222、3s后输入333// 回调天堂setTimeout(() => { console.log(111); setTimeout(() => { console.log(222); setTimeout(() => { console.log(333); }, 3000); }, 2000);}, 1000);function one() { setTimeout(() => { console.log(111); iterator.next(); }, 1000);}function two() { setTimeout(() => { console.log(222); iterator.next(); }, 2000);}function three() { setTimeout(() => { console.log(333); iterator.next(); }, 3000);}function* gen() { yield one(); yield two(); yield three();}//第二个例子function getUsers() { setTimeout(() => { let data = "用户数据"; iterator.next(data); }, 1000);}function getOrders() { setTimeout(() => { let data = "订单数据"; iterator.next(data); }, 1000);}function getGoods() { setTimeout(() => { let data = "商品数据"; iterator.next(data); }, 1000);}function* gen() { let user = yield getUsers(); console.log(user); let orders = yield getOrders(); console.log(orders); let goods = yield getGoods(); console.log(goods);}// 调用生成器函数let iterator = gen();iterator.next();
P24-Promise 介绍与根本应用
const p = new Promise(function (resolve, reject) { setTimeout(() => { // let data = "数据库中的数据"; // resolve(data); let err = "数据读取失败"; reject(err); }, 1000);});p.then( function (value) { console.log(value); }, function (reason) { console.log(reason); });
P25-Promise 封装读取文件
const fs = require("fs");const p = new Promise(function (resolve, reject) { fs.readFile("./es6学习.md", (err, data) => { // 判断失败 if (err) reject(err); // 胜利 resolve(data); });});p.then( (value) => { console.log(value.toString()); }, (err) => { console.log("失败!!!", err); });
P26-Promise 封装 AJAX 申请
const p = new Promise((resolve, reject) => { // 创建对象 const xhr = new XMLHttpRequest(); // 初始化 xhr.open( "GET", "http://rap2api.taobao.org/app/mock/293221/manage/category/info" ); // 发送 xhr.send(); // 绑定事件 xhr.onreadystatechange = function () { if (xhr.readyState === 4) { if (xhr.status >= 200 && xhr.status < 300) { resolve(xhr.response); } else { reject(xhr.status); } } };});// 指定回调p.then( function (value) { console.log(value); }, (reason) => { console.log(reason); });
P27-Promise.prototype.then 办法
// 创立Promise对象const p = new Promise(function (resolve, reject) { setTimeout(() => { let data = "数据库中的数据"; resolve(data); // let err = "数据读取失败"; // reject(err); }, 1000);});// 调用then办法,then办法的返回后果是Promise对象,对象状态由回调函数的执行后果决定// 1. 返回后果是 非promise类型的属性,状态为胜利,返回值为对象胜利值。// 链式调用p.then(function (value) { console.log(value);}).then((result) => { console.log(result);});
28-Promise 实际练习-多个文件内容读取
import fs = require('fs')fs.readFile("./resources/one.md", (err, data) => {});const p =new Promise((resolve,reject) => { fs.readFile('./one.md'),(err,data) => { resolve(data); }})p .then((value) => { return new Promise((resolve,reject) => { fs.readFile('./two.md',(err,data) => { resolve([value,data]) }) })}).then((value) => { return new Promise((resolve,reject) => { fs.readFile('./three.md',(err,data) => { value.push(data); resolve(value) }) })}).then((value) => { console.log(value)})
P29-Promise 的 catch 办法
const p = new Promise((resolve, reject) => { setTimeout(() => { reject("err"); }, 1000);});p.then((result) => { console.log(result);}).catch((err) => { console.log(err);});
P30-汇合介绍与 API
// 申明一个setlet s = new Set();let s2 = new Set(["123", "456", "789", "123"]);// 元素个数console.log(s2.size);// 增加新的元素s2.add("000");// 删除元素s2.delete("111");// 检测console.log(s2.has("789"));// 清空s2.clear(s2);console.log(s2);// forof遍历for (let v of s2) { console.log(v);}
P31-汇合实际
let arr = [1, 2, 3, 4, 5, 6, 7, 1, 2, 3];// 数组去重let result = [...new Set(arr)];console.log(result);// 交加let arr2 = [4, 5, 6, 7];// result = result.filter((item) => {// let s2 = new Set(arr2);// if (s2.has(item)) {// return true;// } else {// return false;// }// });result = [...new Set(arr)].filter((item) => new Set(arr2).has(item));console.log(result);// 并集let union = [...new Set([...arr, ...arr2])];console.log(union);// 差集let diff = [...new Set(arr)].filter((item) => !new Set(arr2).has(item));console.log(diff);
P32-Map 的介绍与 API
// 申明Maplet m = new Map();// 增加元素m.set("name", "gavin");m.set("change", () => { console.log("We can change!");});let key = { school: "SCHOOL",};m.set(key, ["北京", "上海", "广州"]);// sizeconsole.log(m.size);// 删除m.delete("name");// 获取console.log(m.get("change"));console.log(m.get(key));// 清空m.clear();// 遍历for (const v of m) { console.log(v);}
P33-class 意识
// ES5函数工厂function Phone(brand, price) { this.brand = brand; this.price = price;}Phone.prototype.call = function () { console.log("我可打电话!");};// 实例化对象let Huawei = new Phone("华为", 666);Huawei.call();console.log(Huawei);// ES6类class shouji { // 构造方法 constructor(brand, price) { this.brand = brand; this.price = price; } call() { "我可Call you!"; }}let oppo = new shouji("oppo", 9999);console.log(oppo);
P34-class 动态成员
// ES5function Phone() {}(Phone.name = "手机"), (Phone.change = function () { console.log("我可扭转世界"); });Phone.prototype.size = "5英尺";let nokia = new Phone();console.log(nokia.name);console.log(nokia.size);// ES6class Phone { // 动态成员 static name = "手记"; static change() { console.log("you cab change world!"); }}let nokia = new Phone();console.log(nokia.name);console.log(Phone.name);
P35-ES5 构造函数继承
// 手机function Phone(brand, price) { this.brand = brand; this.price = price;}Phone.prototype.call = function () { console.log("我可Call you!");};// 智能手机function SmartPhone(brand, price, color, size) { Phone.call(this, brand, price); this.color = color; this.size = size;}// 设置构造函数的原型SmartPhone.prototype = new Phone();SmartPhone.prototype.constructor = SmartPhone;// 申明子类办法SmartPhone.prototype.playGame = function () { console.log("我可打游戏");};const oppo = new SmartPhone("OPPO", 1234, "White", "6inch");console.log(oppo);
P36-class 的类继承 P37-子类对父类办法的重写
class Phone { constructor(brand, price) { this.brand = brand; this.price = price; } call() { console.log("我可打电话"); }}class SmartPhone extends Phone { constructor(brand, price, color, size) { super(brand, price); this.color = color; this.size = size; } photo() { console.log("我可拍照!"); } playGame() { console.log("我可打游戏"); } call() { console.log("我可视频通话!!!"); }}const xiaomi = new SmartPhone("小米", 1221, "粉色", "6英寸");console.log(xiaomi);xiaomi.call();xiaomi.photo();xiaomi.playGame();
P38-getter 和 setter 的设置
class Phone { get price() { console.log("价格属性被读取"); return "isme"; } get price() { console.log("价格属性被批改"); }}let s = new Phone();console.log(s);s.price = "free";
P39-40-ES6 的数值扩大&&对象办法扩大
// Object.assign 对象合并const config1 = { host: "localhost3000", prot: 3306, name: "root", test: "2",};const config2 = { host: "localhost5000", prot: 3307, name: "gavin",};console.log(Object.assign(config1, config2));// {host: 'localhost5000', prot: 3307, nam: 'gavin'}
P41-P42-P43-P44-模块化
ES6 之前的模块化标准有:
- CommonJS => NodeJS、Browserify
- AMD => requireJS
- CMD => seaJS
模块性能次要由两个命令形成:export 和 import。
- export 命令用于规定模块的对外接口
- import 命令用于输出其余模块提供的性能
// 1. 通用导入形式import * as m1 from "./a.js";// 2.解构赋值模式import { school, teacher } from "./a.js";import { school as guigu, teacher } from "./a.js";// 3.简便模式(针对默认裸露)import A from "./a.js";
P45-浏览器应用 ES6 的另一种形式
P46-babel 对 ES6 模块化代码转换
- 装置工具
babel-cli babel-preset-env browerify(webpack)
- 转译
npx babel src/js -d dist/js
- 打包
npx browserify dist/js/app.js -o dist/bundle.js
P47-ES6 模块化引入 NPM 包
P48-ES7 新个性
- includes 判断数组是否含有某元素
- 2 ** 10 (2 的 10 次方)
P49-ES8 async 函数
async function fn() { // 1.返回一个字符串 // return "硅谷"; // 只有不回调reject,就是胜利Promise对象 // return; // 2.抛出谬误,返回后果为一个失败的Promise对象 // return new Error("出错了"); // 3. 返回的后果为Promise对象 return new Promise((resolve, reject) => { // resolve("胜利"); reject("失败"); });}const result = fn();console.log(result);// 调用then办法result.then( (value) => { console.log(value); }, (err) => { console.warn(err); });
P50-P51-ES8-async 与 await 读取文件内容
function study() { fs.readFile("../es6学习.md", (err, data) => { if (err) reject(err); resolve(data); });}async function main() { let study = await study(); console.log(study.toString());}main();
P52-async 与 await 联合发申请
用同步的办法写异步申请,await 期待后能收到具体值,非 Promise 对象
// 申请封装function sendAJAX() { return new Promise((resolve, reject) => { // 1.创建对象 const x = new XMLHttpRequest(); // 2.初始化 x.open("GET", url); // 3.发送 x.send(); // 4.事件绑定 x.onreadystatechange = function () { if (x.readyState === 4) { if (x.status >= 200 && x.status < 300) { resolve(x.response); } else { reject(x.status); } } }; });}// promise then 办法测试// sendAJAX("http://rap2api.taobao.org/app/mock/293221/manage/user/add")// .then((value) => {// console.log(value);// })// .catch((err) => {// console.log(err);// });// async与await测试async function main() { let result = await sendAJAX( "http://rap2api.taobao.org/app/mock/293221/manage/user/add" ); console.log(result);}
P53-ES8 对象办法扩大
const school = { name: "硅谷", subject: ["web", "JAVA", "大数据"],};// 获取对象所有键console.log(Object.keys(school));// 获取对象所有值console.log(Object.values(school));// 获取entries对象console.log(Object.entries(school));// ★ 多用来创立Mapconst m = new Map(Object.entries(school));console.log(m);// 创立属性的形容对象console.log(Object.getOwnPropertyDescriptors(school));
P54-ES9 扩大运算符与 rest 参数
// ES9中为对象提供了和数组一样的rest参数和扩大运算符function connect({ host, port, ...user }) { console.log(host), console.log(port), console.log(user);}connect({ host: "localhost", port: "3306", username: "gavin", password: "12345",});const skillOne = { q: "吃饭",};const skillTwo = { w: "睡觉", e: "打游戏",};const gavin = { ...skillOne, ...skillTwo };console.log(gavin);
P55-ES9 正则扩大-命名捕捉分组
将合乎正则的数据收集并命名
// 申明字符串let str = "<a href='www.bilibili.com'>b站</a>";// 提取url和[标签文本]// const reg = /<a href='(.*)'>(.*)<\/a>/;// 命名捕捉分组const reg = /<a href='(?<url>.*)'>(?<text>.*)<\/a>/;// 执行const result = reg.exec(str);console.log(result);// console.log(result[1]);// console.log(result[2]);console.log(result.groups.url);console.log(result.groups.text);
P56-ES9 正则扩大-反向断言
从后向前匹配
// 申明字符串let str = "JS12345你晓得么555啦啦啦";// 正向断言// const reg = /\d+(?=啦)/;// const result = reg.exec(str);// 反向断言const reg = /(?<=么)\d+/;const result = reg.exec(str);console.log(result);
P57-ES9 正则扩大-dotAll 模式
代替换行符
// dot . 元字符,代表除换行符以外的的任意单个字符let str = ` <ul> <li> <a>肖申克救赎</a> <p>日期:1998-1-1</p> </li> <li> <a>阿甘正传</a> <p>日期:1998-1-1</p> </li> </ul>`;// 申明正则// const reg = /<li>\s+<a>(.*?)<\/a>\s+<p>(.*?)<\/p>/;const reg = /<li>.*?<a>(?<title>.*?)<\/a>.*?<p>(?<time>.*?)<\/p>/gs;// 执行匹配// const result = reg.exec(str);// console.log(result);let result;let data = [];while ((result = reg.exec(str))) { data.push({ title: result.groups.title, time: result.groups.time });}// 输入后果console.log(data);
P58-ES10 对象扩大办法 Object.fromEntries
将二维数组变成对象
// 二维数组 数组变对象// const result = Object.fromEntries([// ["name", "gavin"],// ["object", "Java,大数据,前端"],// ]);// console.log(result);// Map// const m = new Map();// m.set("name", "GVIGU");// const result = Object.fromEntries(m);// console.log(result);// Object.entries ES8 对象变数组const school = { name: "尚硅谷", Object: "java",};const arr = Object.entries(school);console.log(arr);
P59-ES10-字符串办法扩大
trim 清空格
let str = " i am gavin ";console.log(str);console.log(str.trim());console.log(str.trimStart());console.log(str.trimEnd());
P60-ES10 数组办法扩大 flat 和 flatMap
将数组扁平化,脱壳
// flat 参数为深度,是个数字// const arr = [1, 2, 3, [4, 5, 6, [7, 8, 9]]];// console.log(arr.flat(1));// flatMap 相当于先Map后flatconst arr = [1, 2, 3, 4, 5, 6];const result = arr.flatMap((item) => [item * 10]);console.log(result);
P61-创立 Symbol 的 description
创立 Symbol 形容
// 创立Symbollet s = Symbol("尚硅谷");console.log(s.description);
P62-ES11-class 公有属性
class Person { name; // 公有属性 #age; #weight; constructor(name, age, weight) { this.name = name; this.#age = age; this.#weight = weight; } intro() { console.log(this.#age); console.log(this.#weight); }}const girl = new Person("小绿", 12, "50kg");console.log(girl);// console.log(girl.#age);girl.intro();
P63-ES11-Promise.allSettled 办法
// 申明两个promiseconst p1 = new Promise((resolve, reject) => { setTimeout(() => { resolve("少了p1"); }, 1000);});const p2 = new Promise((resolve, reject) => { setTimeout(() => { // resolve("少了p2"); reject("error"); }, 1000);});// 调用allSettled办法,返回具体Promise对象const result = Promise.allSettled([p1, p2]);console.log(result);// all只在都胜利后返回const res = Promise.all([p1, p2]);console.log(res);
P64-ES11-String.matchAll
★ 十分实用,用来失去正则批量匹配后果
let str = ` <ul> <li> <a>肖申克救赎</a> <p>日期:1998-1-1</p> </li> <li> <a>阿甘正传</a> <p>日期:1965-1-1</p> </li> </ul> `;const reg = /<li>.*?<a>(?<title>.*?)<\/a>.*?<p>(?<time>.*?)<\/p>/gs;const result = str.matchAll(reg);// console.log(result);// for (let v of result) {// console.log(v);// }const arr = [...result];console.log(arr);
P65-ES11-可选链操作符
★ 实用,可用来简化判断
// ?.function main(config) { // const dbHost = config && config.db && config.db.host; const dbHost = config?.db?.host; console.log(dbHost);}main({ db: { host: "localhost:3000", username: "root", },});
P66-ES11-动静 import
动静引入,懒加载
// 返回值为promise对象,懒加载import("./hello.js").then((module) => { module.hello();});
P67-ES11-BigInt 类型
用来超大数值运算
// 大数值运算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));
P68-相对全局对象 globalThis
始终指向全局对象