索华 发表于 2023-9-11 04:35:12

ES6-ES11最通俗易懂保姆级的笔记!人见人爱,花见花开。赶快动起你发财的小

1.  ES6
1.1  let变量声明以及声明特性
声明变量
let a;
let b, c, e;
let f = 100,
g = "红石榴21",
h = [];特性:

[*]变量不能重复声明
let start = "许巍";
let start = "刀郎"; // 报错

[*]块级作用域 全局、函数、eval
{
   let str = "红石榴21"
}
console.log(str); // str is not defined不仅仅针对花括号,if else while for中都是块级作用域

[*]不存在变量提升
console.log(song);
let song = "罗刹海市";// Cannot access 'song' before initialization

[*]不影响作用域链
{
let school = "国防科技大学";
function fn() {
    console.log(school); // 国防科技大学
}
fn();
} 案例
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>let经典案例实践</title>
    <link
      crossorigin="anonymous"
      href="https://cdn.bootcss.com/twitter-bootstrap/3.3.7/css/bootstrap.min.css"
      rel="stylesheet"
    />
</head>
<body>
   
      <h2 >点击切换颜色</h2>
      1
      2
      3
   
   
   
</body>
</html>1.2  const声明常量以及特点
常量声明const SCHOOL = "西南石油大学";特性:

[*]一定要赋初始值
const A; // 报错

[*]一般变量使用大写(潜规则)
const A = 100;

[*]常量的值不能被修改
SCHOOL = "国防科技大学";
console.log(SCHOOL); // Assignment to constant variable.

[*]块级作用域
{
const YWZQ = "go";
}
console.log(YWZQ); // YWZQ is not defined

[*]对于数组和对象元素的修改,不算对常量的修改,不会报错
const LIKE = ["HG", "MC", "LZZ"];
LIKE.push("ZZC");
console.log(LIKE); // ['HG', 'MC', 'LZZ', 'ZZC']1.3  变量的解构赋值
ES6 允许按照一定模式从数组和对象中提取值,对变量进行赋值,这被称为解构赋值。

[*]数组结构赋值
const F4 = ["小沈阳", "赵四", "刘能", "宋小宝"];
let = F4;
console.log(xiao); // 小沈阳
console.log(zhao); // 赵四
console.log(liu); // 刘能
console.log(song); // 宋小宝

[*]对象结构赋值
const zhao = {
name: "赵本山",
age: "65",
xiaoping: function () {
    console.log("我会演小品");
},
};
let { name, age, xiaoping } = zhao;
console.log(name); // 赵本山
console.log(age); // 65
console.log(xiaoping); // 输出ƒ(){}
xiaoping(); // 我会演小品如果不用结构的形式console.log(zhao.name);
console.log(zhao.age);
zhao.xiaoping();
zhao.xiaoping();1.4  模板字符串
ES6 引入新的声明字符串的方式 『``』 '' ""

[*]声明变量
let str = `今天天气有点热啊`;
console.log(str);

[*]内容可以直接出现换行符
let str =
"<ul>" + "<li>张三</li>" + "<li>李四</li>" + "<li>王五</li>" + "</ul>"; // 之前的写法
let str =
`<ul>
    <li>张三1</li>
    <li>李四2</li>
    <li>王五3</li>
</ul>`;
document.getElementById("appID").innerHTML = str;

[*]字符串的拼接
let str = "许巍";
let lovest = `我喜欢${str}的歌,名字叫做<<蓝莲花>>。`;
console.log(lovest);1.5  对象的简化写法ES6 允许在大括号里面,直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁let name = "红石榴21";
let change = function () {
console.log("我想改变世界!!");
};
const dream = {
name,
change,
// improve: function () {
//   console.log("我又get到了新的技能!");
// },
// 简写形式
improve() {
    console.log("hahaha");
},
};
dream.change();
dream.improve();1.6  箭头函数以及声明特点
ES6 允许使用「箭头」(=>)定义函数。声明一个函数let fn = function() {}
let fn = function (a, b) {
    return a + b;
};
// 调用函数
let result = fn(1, 2);
console.log(result); // 3特性:

[*]this 是静态的,this 始终指向函数声明时所在作用域下的 this 的值
function getName() {
console.log(this.name);
}
let getName2 = () => {
console.log(this.name);
};
// 设置 window 对象的name 属性
window.name = "红石榴21";
const school = {
name: "博商学院",
};
// 直接调用
getName(); // 红石榴21
getName2(); // 红石榴21
// call 方法调用
getName.call(school); // 博商学院
getName2.call(school); // 红石榴21

[*]不能作为构造函数实例化对象
let Person = (name, age) => {
this.name = name;
this.age = age;
};
let me = new Person("hong", 18);
console.log(me); // Person is not a constructor

[*]不能使用 arguments 变量
let fn = () => {
console.log(arguments);
};
fn(1, 2, 3); // arguments is not defined

[*]箭头函数的简写
// 1) 省略小括号,当形参有且只有一个的时候
let add = n => {
return n + n;
};
console.log(add(9)); // 18
// 2) 省略花括号,当代码体只有一条语句的时候,此时 return 必须省略
// 而且语句的执行结果就是函数的返回值
let pow = (n) => n * n;
console.log(pow(9)); // 81 箭头函数的实践与应用场景
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>箭头函数的实践与应用场景</title>
</head>
<body>
   
   
   
</body>
</html>1.7  函数参数的默认值设置ES6 允许给函数参数赋值初始值

[*]形参初始值 具有默认值的参数,一般位置要靠后(潜规则)
function add(a, b, c) {
return a + b + c;
}
let result = add(1, 2, 3);
console.log(result); // 6
// 设置默认值
function add(a, b, c = 4) {
return a + b + c;
}
let result = add(1, 2);
console.log(result);// 7

[*]与结构赋值结合
function connect({ host, username, password, port }) {
console.log(host);
console.log(username);
console.log(password);
console.log(port);
}
connect({
host: "127.0.0.1",
username: "admin",
password: "admin",
port: 80,
});1.8  rest参数ES6 引入 rest 参数,用于获取函数的实参,用来代替 argumentsES5 获取实参的方式function date() {
console.log(arguments);
}
date("俞老师", "王老师", "顾老师");
rest 参数
function date(...args) {
console.log(args); // [俞老师", "王老师", "顾老师] 变成数组就可以使用 filter、some、every、map
}
date("俞老师", "王老师", "顾老师");rest 参数必须要放到参数最后function fn(a, b, ...args) {
console.log(a); // 1
console.log(b); // 2
console.log(args); //
}
fn(1, 2, 3, 4, 5, 6);1.9  扩展运算符的介绍
『...』 扩展运算符能将『数组』转换为逗号分隔的『参数序列』// 声明一个数组
const tfbody = ["朴树", "许巍", "刀郎"];
// 声明一个函数
function likeSinger() {
console.log(arguments);
}
likeSinger(...tfbody);
console.log(tfbody);输出结果

 扩展运算符的应用

[*]数组的合并
const siDaTianWang = ["刘德华", "张学友", "郭富城", "黎明"];
const xiaoHuDui = ["吴奇隆", "陈志朋", "苏有朋"];
// const zuHe = siDaTianWang.concat(xiaoHuDui); // 使用concat实现数组拼接
// console.log(zuHe); // ["刘德华", "张学友", "郭富城", "黎明","吴奇隆", "陈志朋", "苏有朋"]
const zuHe = [...siDaTianWang, ...xiaoHuDui];
console.log(zuHe); // ["刘德华", "张学友", "郭富城", "黎明","吴奇隆", "陈志朋", "苏有朋"]

[*]数组的克隆
const ziMu = ["A", "B", "C"];
const newArr = [...ziMu];
console.log(ziMu); // ["A", "B", "C"]
console.log(newArr); // ["A", "B", "C"]

[*]将伪数组转为真正的数组
const divS = document.querySelectorAll("div");
const divArr = [...divS];
console.log(divArr);输出结果

1.10.1  Symbol的介绍与创建

[*]创建Symbol
let s = Symbol();
console.log(s, typeof s); // Symbol() 'symbol'
let s2 = Symbol("嘀嘀咕咕");
let s3 = Symbol("嘀嘀咕咕");
console.log(s2, typeof s2); // Symbol(嘀嘀咕咕) 'symbol'
console.log(s2 === s3); // false

[*]Symbol.for 创建
let s4 = Symbol.for("我的心思");
let s5 = Symbol.for("我的心思");
console.log(s4); // Symbol(我的心思)
console.log(s4 === s5); // true

[*]不能与其他数据进行运算
let result = s + 100; // Cannot convert a Symbol value to a number
let result = s > 100; // Cannot convert a Symbol value to a number
let result = s + s; // Cannot convert a Symbol value to a number
// USONB you are so niubility
// u   undefined
// s   string   symbol
// o   object
// n   null   number
// b   boolean 1.10.2 对象添加Symbol类型的属性
向对象中添加方法 up downlet game = {
name: "学爸",
up: function () {},
down: function () {},
};

// 声明一个对象
let methods = {
up: Symbol(),
down: Symbol(),
};
// console.log(methods);

game = function () {
console.log("我可以改变世界!");
};

game = function () {
console.log("海鲜都留给小日子吃吧!");
};
console.log(game);输出结果

let phws = {
name: "排核污水",
: function () {
    console.log("打断小日子的狗腿");
},
: function () {
    console.log("小日子公开食海鲜,真香");
},
};
console.log(phws);输出结果

1.10.3  Symbol的内置属性

[*]Symbol.hasInstance
当其他对象使用 instanceof 运算符,判断是否为该对象的实例时,会调用这个方法class Person {
static (param) {
    console.log(param);
    console.log("我被用来检测类型了");
    return true;
}
}
let o = {};
console.log(o instanceof Person);

[*]Symbol.isConcatSpreadable
对象的 SymbolisConcatSpreadable 属性等于的是一个布尔值,表示该对象用于Array.prototype.concat()时,是否可以展开。const arr = ;
const arr2 = ;
arr2 = false;
console.log(arr.concat(arr2));除了定义自己使用的 Symbol 值以外,ES6 还提供了 11个内置的 Symbol值,指向语言内部使用的方法。

1.11.1  迭代器介绍
迭代器(iterator)【对象中的一个属性】是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署 iterator 接口,就可以完成遍历操作。

[*]ES6 创造了一种新的遍历命令 for...of 循环,lterator 接口主要供 for...of 消费


[*]原生具备 iterator 接口的数据(可用 for of 遍历)
a) Array
b) Arguments
c) Set
d) Map
e) String
f) TypedArray
g) NodeList

[*]工作原理
a) 创建一个指针对象,指向当前数据结构的起始位置
b) 第一次调用对象的 next 方法,指针自动指向数据结构的第一个成员
c) 接下来不断调用 next 方法,指针一直往后移动,直到指向最后一个成员
d) 每调用 next 方法返回一个包含 value 和done 属性的对象
注:需要自定义遍历数据的时候,要想到迭代器。
// 声明一个数组
const tangShengShiTu = ["唐僧", "孙悟空", "猪八戒", "沙和尚"];
// 使用 for...of 遍历数组
// for (let v of tangShengShiTu) {
//   console.log(v); // "唐僧", "孙悟空", "猪八戒", "沙和尚"
// }

let iterator = tangShengShiTu();
// 调用对象的next方法
console.log(iterator.next()); // {value: '唐僧', done: false}
console.log(iterator.next()); // {value: '孙悟空', done: false}
console.log(iterator.next()); // {value: '猪八戒', done: false}
console.log(iterator.next()); // {value: '沙和尚', done: false}
console.log(iterator.next()); // {value: '', done: true}1.11.2   迭代器应用-自定义遍历数据
// 声明一个对象
const banJi = {
name: "朗月班",
stuList: ["xiaohong", "xiaolian", "xiaojia", "xiaoyuan"],
() {
    // 索引变量
    let index = 0;
    // let _this = this;
    // return {
    //   next: function () {
    //   if (index < _this.stuList.length) {
    //       const result = { value: _this.stuList, done: false };
    //       // 下标自增
    //       index++;
    //       // 返回结果
    //       return result;
    //   } else {
    //       return { value: _this.stuList, done: true };
    //   }
    //   },
    // };
    // 使用箭头函数
    let next = () => {
      if (index < this.stuList.length) {
      const result = { value: this.stuList, done: false };
      // 下标自增
      index++;
      // 返回结果
      return result;
      } else {
      return { value: this.stuList, done: true };
      }
    };
    return { next };
},
};

// 需求: 只能使用for of 遍历stuList,通过面向对象
// 不能使用 banJi.stuList.forEach
for (let v of banJi) {
console.log(v); // "xiaohong", "xiaolian", "xiaojia", "xiaoyuan"
}1.12.1   生成器函数声明与调用
生成器函数是 ES6 提供的一种异步编程解决方案,语法行为与传统函数完全不同
// 生成器其实就是一个特殊的函数
// 异步编程 纯回调函数 node fs ajax mongodb
// 函数代码的分隔符
function* gen() {
console.log("hello generator"); // hello generator
}
let iterator = gen();
iterator.next();另一个例子
function* gen() {
console.log(111);
yield "光辉岁月";
console.log(222);
yield "蓝莲花";
console.log(333);
yield "像风一样自由";
console.log(444);
}
let iterator = gen();
console.log(iterator.next()); // 111 {value: '光辉岁月', done: false}
console.log(iterator.next()); // 222 {value: '蓝莲花', done: false}
console.log(iterator.next()); // 333 {value: '像风一样自由', done: false}
console.log(iterator.next()); // 444 {value: 'undefined', done: true}
// 遍历
for (let v of gen()) {
console.log(v);
}遍历输出结果

1.12.2   生成器函数的参数传递
function* gen() {
yield 111;
yield 222;
yield 333;
}
// 执行获取迭代器对象
let iterator = gen();
console.log(iterator.next()); // {value: 111, done: false}
console.log(iterator.next()); // {value: 222, done: false}
console.log(iterator.next()); // {value: 333, done: false}
console.log(iterator.next()); // {value: undefined, done: true}另一个例子
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")); // 第二次调用作为第一个yield的返回参数
console.log(iterator.next("CCC")); // 第三次调用作为第二个yield的返回参数
console.log(iterator.next("DDD")); // 第四次调用作为第三个yield的返回参数
console.log(iterator.next("FFF"));输出结果

1.12.3   生成器函数实例异步编程 文件操作 网络操作(ajax, request) 数据库操作需求-1 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);
}, 3000);
}
function* gen() {
yield one();
yield two();
yield three();
}
// 调用生成器函数
let iterator = gen();
iterator.next();输出结果

1.12.4   生成器函数实例-2
需求-2 模拟获取 先调用用户数据,然后调用订单数据,最后调用商品数据function getUsers() {
setTimeout(() => {
    let data = "用户数据";
    console.log(data);
    iterator.next();
}, 1000);
}
function getOrders() {
setTimeout(() => {
    let data = "订单数据";
    console.log(data);
    iterator.next();
}, 1000);
}
function getGoods() {
setTimeout(() => {
    let data = "商品数据";
    console.log(data);
}, 1000);
}
function* gen() {
yield getUsers();
yield getOrders();
yield getGoods();
}
// 调用生成器函数
let iterator = gen();
iterator.next();输出结果

 需求-2,补充调用传参
function getUsers() {
setTimeout(() => {
    let data = "用户数据1";
    iterator.next(data);
}, 1000);
}
function getOrders() {
setTimeout(() => {
    let data = "订单数据2";
    iterator.next(data);
}, 1000);
}
function getGoods() {
setTimeout(() => {
    let data = "商品数据3";
    iterator.next(data);
}, 1000);
}
function* gen() {
let users = yield getUsers();
console.log(users);
let orders = yield getOrders();
console.log(orders);
let goods = yield getGoods();
console.log(goods);
}
// 调用生成器函数
let iterator = gen();
iterator.next();输出结果

1.13.1  Promise介绍与基本使用
Promise 是ES6引入的异步编程的新解决方案。语法上 Promise 是一个构造函数用来封装异步操作并可以获取其成功或失败的结果。

[*]Promise构造函数:Promise(excutor)
[*]Promise.prototype.then 方法
[*] Promise.prototype.catch 方法
// 实例化 Promise 对象
const p = new Promise(function (resolve, reject) {
setTimeout(() => {
    // let data = "读取用户数据";
    // resolve(data);
    let err = "读取数据失败!";
    reject(err);
}, 1000);
});
// 调用 promise 对象的 then 方法
p.then(
function (value) {
    console.log(value); // 读取用户数据
},
function (error) {
    console.error(error); // 读取数据失败!
}
);1.13.2  Promise封装读取文件
// 1、引入 fs 模块
const fs = require("fs");
// 2、调用方法读取文件
// fs.readFile('./resources/为学.md', (err, data) => {
//   // 如果失败,则抛出错误
//   if (err) throw err;
//   // 如果没有出错,则输出内容
//   console.log(data.toString());
// });
// 3、使用 Promise 封装
const p = new Promise(function (resolve, reject) {
fs.readFile("./resources/为学.md", (err, data) => {
    // 判断如果失败
    if (err) reject(err);
    // 如果成功
    resolve(data);
});
});
p.then(function (value) {
console.log(value.toString());
}, function (err) {
console.log("读取失败!!")
})输出结果

1.13.3  Promise封装AJAX请求

[*]方法-1  普通写法
// 接口地址: https://api.apiopen.top/api/getDynamic
// 1、创建对象
const xhr = new XMLHttpRequest();
// 2、初始化
xhr.open("GET", "https://api.apiopen.top/api/getDynamic");
// 3、发送
xhr.send();
// 4、绑定事件,处理响应结果
xhr.onreadystatechange = function () {
// 判断
if (xhr.readyState === 4) {
    // 判断响应状态码 200-299
    if (xhr.status >= 200 && xhr.status < 300) {
      console.log(xhr.response);
    } else {
      // 如果失败
      console.log(xhr.status);
    }
}
};

[*]方法-2  Promise封装
const p = new Promise((resolve, reject) => {
// 1、创建对象
const xhr = new XMLHttpRequest();
// 2、初始化
xhr.open("GET", "https://api.apiopen.top/api/getDynamic");
// 3、发送
xhr.send();
// 4、绑定事件,处理响应结果
xhr.onreadystatechange = function () {
    // 判断
    if (xhr.readyState === 4) {
      // 判断响应状态码 200-299
      if (xhr.status >= 200 && xhr.status < 300) {
      // 表示成功
      resolve(xhr.response);
      } else {
      // 如果失败
      reject(xhr.status);
      }
    }
};
});
// 指定回调
p.then(
function (value) {
    console.log(value);
},
function (error) {
    console.log(error);
}
);1.13.4  Promise.prototype..then方法
// 创建 promise 对象
const p = new Promise((resolve, reject) => {
setTimeout(() => {
    resolve("获取用户数据成功!");
}, 1000);
});
// 调用 then 方法 then方法的返回结果是 Promise 对象,对象状态由回调函数的执行结果决定
// 1、如果回调函数中返回的结果是 非 promise 类型的属性, 状态为成功,返回值为对象的成功的值
const result = p.then(
(value) => {
    // console.log(value);
    // 1、非 promise 类型的属性
    return "I Love You";
    // 2、是promise 对象
    // return new Promise((resolve, reject) => {
      // resolve("ok");
      // reject('error');
    // });
    // 3、抛出错误
    // throw new Error("出错啦!");
    // throw '出错啦!'
},
(reason) => {
    console.error(reason);
}
);
console.log(result);
// p.then(
//   (value) => {
//   console.log(value);
//   },
//   (error) => {
//   console.log(error);
//   }
// );
// 链式调用
p.then(value=>{
}).then(reason=>{
})1.13.5  Promise实践练习-多个文件内容读取

[*]方法-1  回调地狱
fs.readFile("./resources/为学.md", (err, data1) => {
fs.readFile("./resources/插秧诗.md", (err, data2) => {
    fs.readFile("./resources/观书有感.md", (err, data3) => {
      // let result = data1 + '\r\n' + data2 + '\r\n' + data3;
      let result = `${data1}\r\n${data2}\r\n${data3}`
      console.log(result);
    })
})
});

[*]方法-2  使用 promise 实现
const p = new Promise((resolve, reject) => {
fs.readFile("./resources/为学.md", (err, data) => {
    resolve(data);
})
});
p.then(value => {
return new Promise((resolve, reject) => {
    fs.readFile("./resources/插秧诗.md", (err, data) => {
      resolve();
    })
})
}).then(value => {
return new Promise((resolve, reject) => {
    fs.readFile("./resources/观书有感.md", (err, data) => {
      // 压入
      value.push(data);
      resolve(value);
    });
})
}).then(value => {
console.log(value.join('\r\n'));
})

[*]方法-3  使用生成器函数
function one() {
fs.readFile("./resources/为学.md", (err, data) => {
    iterator.next(data);
})
}
function two() {
fs.readFile("./resources/插秧诗.md", (err, data) => {
    iterator.next(data);
})
}
function three() {
fs.readFile("./resources/观书有感.md", (err, data) => {
    iterator.next(data);
})
}
function* gen() {
let a = yield one();
let b = yield two();
let c = yield three();
let d = `${a}\r\n${b}\r\n${c}`;
console.log(d.toString());
};
// 调用生成器函数
let iterator = gen();
iterator.next();输出结果

1.13.6  Promise对象catch方法
const p = new Promise((resolve, reject) => {
setTimeout(() => {
    // 设置 P 对象的状态为失败,并设置失败的值
    reject("出错啦!");
}, 1000);
});
// p.then(value=> {
//   console.log(value);
// }, reason=>{
//   console.log(reason);
// });
p.catch((reason) => {
console.warn(reason); // 出错啦!
});1.14  ES6-集合介绍与API
ES6 提供了新的数据结构 Set(集合)。它类似于数组,但成员的值都是唯一的集合实现了 iterator 接口,所以可以使用[扩展运算符]和 进行遍历集合的属性和方法:

[*]size 返回集合的元素个数
[*]add 增加一个新元素,返回当前集合
[*]delete 删除元素,返回 boolean 值
[*]has 检测集合中是否包含某个元素,返回 boolean 值
// 声明一个 set
let s = new Set();
console.log(s); // Set(0) {size: 0}
let s2 = new Set(["昨天", "今天", "明天", "未来", "今天"]);
console.log(s2); // Set(4) {'昨天', '今天', '明天', '未来'}
// 元素的个数
console.log(s2.size);
// 添加新的元素
s2.add("过去");
console.log(s2); // Set(5) {'昨天', '今天', '明天', '未来', '过去'}
// 删除元素
s2.delete("昨天");
console.log(s2); // Set(4) {'今天', '明天', '未来', '过去'}
// 清空
s2.clear();
console.log(s2); // Set(0) {size: 0}1.15  ES6-集合实践
let arr = ;

[*]数组去重
let result = [...new Set(arr)];
console.log(result); //

[*]交集
集合论中,设A,B是两个集合,由所有属于集合A且属于集合B的元素所组成的集合,叫做集合A与集合B的交集(intersection),记作A∩B。let arr2 = ;
let result = [...new Set(arr)].filter((item) => {
let s2 = new Set(arr2); // 去重后,4 5 6
if (s2.has(item)) {
    return true;
} else {
    return false;
}
});
console.log(result); // 交集的简写形式
let arr2 = ;
let result = [...new Set(arr)].filter(item=>new Set(arr2).has(item));
console.log(result); //

[*]并集
给定两个集合A,B,把他们所有的元素合并在一起组成的集合,叫做集合A与集合B的并集,记作A∪B,读作A并B。let arr2 = ;
let union = [...new Set([...arr, ...arr2])];
console.log(union); //

[*]差集
差集是指,由所有属于A但不属于B的元素组成的集合。let arr2 = ;
let diff = [...new Set(arr)].filter(item=>!(new Set(arr2).has(item)));
console.log(diff); // 1.16  ES6-Map的介绍与APIES6 提供了 Map 数据结构。它类似于对象,也是键值对的集合。但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。Map 也实现了iterator 接口,所以可以使用[扩展运算符]和 进行遍历。Map的属性和方法:

[*]size 返回Map的元素个数
[*]set 增加一个新元素,返回当前 Map
[*]get 返回键名对象的键值
[*]has 检测 Map 中是否包含某个元素,返回 boolean 值
[*]clear 清空集合,返回undefined
// 声明 Map
let m = new Map();
// console.log(m);
// 添加元素
m.set("name", "成都大运会");
// console.log(m); // Map(1) {'name' => '成都大运会'}
m.set("change", function () {
console.log("我可以改变世界!!");
});
let key = {
school: "西南石油大学",
};
m.set(key, ["北京", "上海", "广州", "深圳"]);
// console.log(m);
// size
// console.log(m.size); // 3
// 删除
// m.delete("name");
// console.log(m);
// 清空
// m.clear();
// console.log(m); // Map(0) {size: 0}
// 遍历
for(let v of m) {
    console.log(v);
}1.17.1  ES6-class介绍与初体验
ES6 提供了更接近传统语言的写法,引入了 class(类) 这个概念,作为对象的模板。通过 class 关键字,可以定义类。基本上,ES6 的class 可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的 class 写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。知识点:

[*]class声明类
[*]constructor 定义构造函数初始化
[*]extends 继承父类
[*]super 调用父级构造方法
[*]static 定义静态方法和属性
[*]父类方法可以重写
// ES5
function Huawei(bank, price) {
this.bank = bank;
this.price = price;
}
// 在原型上添加方法
Huawei.prototype.call = function () {
console.log("我可以打电话哦!");
};
let hW = new Huawei("3999", "华为荣耀");
hW.call();
console.log(hW);
// ES6
class XiaoMi {
constructor(bank, price) {
    this.bank = bank;
    this.price = price;
}
// 方法必须使用该语法,不能使用 ES5 的对象完整形式
call() {
    console.log("我为发烧而生");
}
}
let xM = new XiaoMi("699", "红米");
xM.call();
console.log(xM);输出结果

1.17.2  ES6-class静态成员
// 构造函数也是一个对象
function Phone() {}
Phone.name = "手机";
Phone.change = function () {
console.log("我可以改变世界!");
};
Phone.prototype.size = "5.5inch";
// 实例对象是实例对象,函数对象是函数对象。
let tianYu = new Phone();
console.log(tianYu.name); // undefined
// tianYu.change(); // error tianYu.change is not a function
console.log(tianYu.size); // 5.5inch
class Computer {
// 静态属性
static name = "戴尔";
static change() {
    console.log("我可以改变世界!");
}
}
let dianNao = new Computer();
console.log(dianNao.name); // undefined
// 静态方法是属于类,不属于实例方法
console.log(Computer.name); // 戴尔1.17.3  ES5构造函数继承// 手机
function Phone(brand, price) {
this.brand = brand;
this.price = price;
}
Phone.prototype.call = function () {
console.log("我可以打电话");
};
// 智能手机
function SmartPhone(brand, price, color, size) {
Phone.call(this, brand, price);
this.color = color;
this.price = price;
}
// 设置子构造函数的原型
SmartPhone.prototype = new Phone();
// 校正一下,你不这样做也行
// SmartPhone.prototype.constructor = SmartPhone;
// 声明子类的方法
SmartPhone.prototype.photo = function () {
console.log("我可以拍照");
};
SmartPhone.prototype.playGame = function () {
console.log("我可以打游戏");
};
const chuiZi = new SmartPhone("锤子", 2999, "黑色", "5.5inch");
console.log(chuiZi);
chuiZi.call();
chuiZi.photo();
chuiZi.playGame(); 输出结果

1.17.4  ES6-class的类继承
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); // Phone.call(this, brand, price);
    this.color = color;
    this.size = size;
}
photo() {
    console.log("我能拍照!");
}
playGame() {
    console.log("我能玩游戏!");
}
}
let xiaoMi = new SmartPhone("小米", 699, "黑色", "5.5inch");
console.log(xiaoMi);
xiaoMi.call();
xiaoMi.photo();
xiaoMi.playGame(); 输出结果

1.17.4  ES6-子类对父类方法的重写
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); // Phone.call(this, brand, price);
    this.color = color;
    this.size = size;
}
photo() {
    console.log("我能拍照!");
}
playGame() {
    console.log("我能玩游戏!");
}
// ES6-子类对父类方法的重写
call() {
    console.log("我可以视频通话哦!");
}
}
let xiaoMi = new SmartPhone("小米", 699, "黑色", "5.5inch");
console.log(xiaoMi);
xiaoMi.call();
xiaoMi.photo();
xiaoMi.playGame(); 输出结果

1.18  ES6的数值扩展

[*]Number.EPSILON 是 JavaScript 表示的最小精度
 EPSILON 属性的值接近于 2.2204460492503130808472633361816E-16function equal(a, b) {
if (Math.abs(a - b) < Number.EPSILON) {
    return true;
} else {
    return false;
}
}
console.log(0.1 + 0.2); // 0.30000000000000004
console.log(0.1 + 0.2 === 0.3); // false
console.log(equal(0.1 + 0.2, 0.3)); // true

[*]二进制和八进制
let b = 0b1010;
console.log(b); // 10
let o = 0o777;
console.log(o); // 511
let d = 100;
console.log(d); // 100
let x = 0xff;
console.log(x); // 255

[*]Number.isNaN 检测一个数值是否为 NaN
console.log(Number.isNaN(123)); // false

[*]Number.parseInt Number.parseFloat字符串转整数
console.log(Number.parseInt("511111fuck")); // 511111
console.log(Number.parseFloat("3.1415926疯狂")); // 3.1415926

[*]Number.isInteger() 判断一个数是否为整数
console.log(Number.isInteger(5)); // true
console.log(Number.isInteger(2.5)); // false

[*]Math.trunc 将数字的小数部分抹掉
console.log(Math.trunc(3.5)); // 3

[*]Math.sign 判断一个数到底为正数 负数 还是零
console.log(Math.sign(100)); // 1
console.log(Math.sign(0)); // 0
console.log(Math.sign(-20000)); // -11.19  ES6的对象方法扩展

[*]Object.is 判断两个值是否完全相等
console.log(Object.is(120, 120)); // true ===
console.log(Object.is(NaN, NaN)); // true
console.log(NaN === NaN); // false

[*]Object.assign 对象的合并
const obj1 = {
host: "localhost",
port: 3306,
username: "admin",
password: "admin",
};
const obj2 = {
host: "127.0.0.1",
port: 8080,
username: "root",
password: "root",
isLogin: false,
};
console.log(Object.assign(obj1, obj2)); // {host: '127.0.0.1', port: 8080, username: 'root', password: 'root', isLogin: false}

[*]Object.setPrototypeOf 设置原型对象  Object.getPrototypeof
const school = {
name: "研究院",
};
const cities = {
xiaoqu: ["北京", "上海", "广州"],
};
Object.setPrototypeOf(school, cities);
console.log(Object.getPrototypeOf(school));
console.log(school);输出结果

1.20.1  ES6-模块化介绍、优势以及产品

[*]模块化
模块化是指将一个大的程序文件,拆分成许多小的文件,然后将小文件组合起来。

[*]模块化的好处
模块化的优势有以下几点:1)  防止命名冲突2)  代码复用3)  高维护性

[*]模块化规范产品
ES6之前的模块化规范有:1)  CommonJS => NodeJS、Browserify2)  AMD => requireJS3)  CMD => seaJS

[*]ES6 模块化语法
模块功能主要由两个命令构成:export 和import。1) export 命令用于规定模块的对外接口2) import 命令用于输入其他模块提供的功能 1.20.2  ES6-浏览器使用ES6模块化引入模块html代码<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>ES6-浏览器使用ES6模块化引入模块</title>
</head>
<body>
   
</body>
</html>js代码-m1.js
// 分别暴露
export let school = "西南石油大学";
export function study() {
    console.log("我可以学习到新的技能!!")
}1.20.3  ES6模块暴露数据语法汇总
html代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>ES6模块暴露数据语法汇总</title>
</head>
<body>
   
</body>
</html>js代码-m2.js
// 统一暴露
let school = "西南石油大学";
function findJob() {
    console.log("我一定能行!");
}
export { school, findJob };js代码-m3.js
// 默认暴露
export default {
    school: "西南石油大学",
    change: function () {
      console.log("我可以改变自己!");
    }
}1.20.4  ES6引入模块数据语法汇总
html代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>ES6引入模块数据语法汇总</title>
</head>
<body>
   
</body>
</html>1.20.5  ES6-浏览器使用ES6模块化方式二
html代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>ES6-浏览器使用ES6模块化方式二</title>
</head>
<body>
   
   
   
   
</body>
</html>1.20.6  ES6-babel对ES6模块化代码转换
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>ES6-babel对ES6模块化代码转换</title>
</head>
<body>
   
   
</body>
</html>1.20.7  ES6模块化引入NPM包
需求-修改页面的背景颜色为粉色步骤:1)安装jquery npm i jquery
2)html代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>ES6模块化引入NPM包</title>
</head>
<body>
   
</body>
</html>3)js代码-app.js
import $ from 'jquery';// const $ = require("jquery");
$("body").css("background", "pink");2.  ES7
2.1  ES7新特性

[*]Arrayprototype.includes
Includes 方法用来检测数组中是否包含某个元素,返回布尔类型值const mingZhu = ["西游记", "红楼梦", "三国演义", "水浒传"];
console.log(mingZhu.includes("西游记")); // true
console.log(mingZhu.includes("石头记")); // false

[*]指数操作符
在ES7中引入指数运算符[**],用来实现幂运算,功能与Math.pow 结果相同console.log(2 ** 10); // 1024
console.log(Math.pow(2, 10)); // 10243.  ES8
3.1  ES8-async函数

[*]async和await
async和await两种语法结合可以让异步代码像同步代码一样

[*]async函数
1)async函数的返回值为 promise 对象,
2)promise对象的结果由 async函数执行的返回值决定
// async 函数
async function fn() {
// 返回一个字符串
// return "好炎热";
// 返回的结果不是一个 Promise 类型的对象,返回的结果就是成功 Promise 对象
// return;
// 抛出错误,返回的结果是一个失败的 Promise
// throw new Error("出错啦!");
// 返回的结果如果是一个 Promise 对象
return new Promise((resolve, reject) => {
    // resolve("读取数据成功!");
    reject("读取数据失败!");
});
}
const result = fn();
// console.log(result);
// 调用 then 方法
result.then(value => {
    console.log(value);
},reason => {
    console.warn(reason);
}
);3.2  ES8-await表达式

[*]await 表达式
1)await 必须写在async函数中
2)await 右侧的表达式一般为 promise 对象
3)await 返回的是 promise 成功的值
4)await 的 promise 失败了,就会抛出异常,需要通过 try...catch 捕获处理
// 创建 Promise 对象
let p = new Promise((resolve, reject) => {
// resolve("请求成功!");
reject("请求失败!");
});
// await 要放在 async 函数中.
async function main() {
try {
    let result = await p;
    console.log(result);
} catch (e) {
    console.error(e);
}
}
// 调用函数
main();3.3  ES8-async与await结合读取文件内容
// 引入fs
const fs = require("fs");
// 读取为学
function readWeiXue() {
return new Promise((resolve, reject) => {
    fs.readFile("./resources/为学.md", (err, data) => {
      // 如果失败
      if (err) reject(err);
      // 如果成功
      resolve(data);
    })
})
}
// 读取插秧诗
function readChaYangShi() {
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 函数
async function main() {
// 获取为学内容
let weiXue = await readWeiXue();
// 获取插秧诗内容
let chaYang = await readChaYangShi();
// 获取观书有感
let guanShu = await readGuanShu();
console.log(weiXue.toString());
console.log(chaYang.toString());
console.log(guanShu.toString());
}
main();3.4  ES8-async与await结合发送AJAX请求
// 发送 AJAX 请求,返回的结果是 Promise 对象
function sendAJAX(url) {
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("https://api.apiopen.top/api/getDynamic").then(value=>{
//   console.log(value);
// },reason=>{
// });
// async 与 await 测试
async function main() {
// 发送 AJAX 请求
let result = await sendAJAX("https://api.apiopen.top/api/getDynamic");
// console.log(result);
let tianQi = await sendAJAX(
    "https://www.tianqiapi.com/api/?version=v1&city=%E5%8C%97%E4%BA%AC&appid=23941491&appsecret=TXoD5e8P"
);
console.log(tianQi);
}
main();3.5  ES8对象方法扩展

[*]Obiect.values 和 Obiect.entries
1)Obiect.values()方法返回一个给定对象的所有可枚举属性值的数组2)Obiect.entries()方法返回一个给定对象自身可遍历属性 的数组// 声明对象
const school = {
name: "西南石油大学",
xiaoqu: ["新都", "南充"],
major: ["计算机科学与技术", "软件工程", "人工智能"],
};获取对象所有的键console.log(Object.keys(school));输出结果
获取对象所有的值console.log(Object.values(school));输出结果
 entries
console.log(Object.entries(school));输出结果

[*] Object.getOwnPropertyDescriptors
该方法返回指定对象所有自身属性的描述对象console.log(Object.getOwnPropertyDescriptors(school));输出结果
 使用Object.create()创建对象
const obj = Object.create(null, {
name: {
    // 设置值
    value: "哈哈",
    // 属性特征
    writable: true,
    configurable: true,
    enumerable: true,
},
});
console.log(obj); // {name: '哈哈'}4.  ES9
4.1  ES9扩展运算符与rest参数
Rest 参数与 spread 扩展运算符在 ES6 中已经引入,不过 ES6 中只针对于数组,在 ES9 中为对象提供了像数组一样的 rest 参数和扩展运算符。rest 参数function connect({ host, port, ...user }) {
console.log(host); // 127.0.0.1
console.log(port); // 3306
console.log(user); // {username: 'root', password: 'root', type: 'master'}
}
connect({
host: "127.0.0.1",
port: 3306,
username: "root",
password: "root",
type: "master",
});对象合并const skillOne = {
a: "html5",
k: "其他",
};
console.log({ ...skillOne }); // {a: 'html5', k: '其他'}
// console.log({ ...skillOne }['a']); // html5
const skillTwo = {
b: "css3",
};
const skillThree = {
c: "vue3",
};
const skillFour = {
d: "react",
};
const skill = { ...skillOne, ...skillTwo, ...skillThree, ...skillFour };
console.log(skill); // {a: 'html5', k: '其他', b: 'css3', c: 'vue3', d: 'react'}
console.log(skill["d"]); // react4.2  ES9正则扩展-命名捕获分组
声明一个字符串let str = '百度';// 提取 url 与 『标签文本』
const reg = /<a target="_blank" href="https://www.cnblogs.com/(.*)">(.*)<\/a>/;
// 执行
const result = reg.exec(str);
console.log(result);
console.log(result); // https://www.baidu.com
console.log(result); // 百度输出结果

 分组命名
const reg = /<a target="_blank" href="https://www.cnblogs.com/(?<url>.*)">(?<text>.*)<\/a>/;
const result = reg.exec(str);
console.log(result);
console.log(result.groups.url); // https://www.baidu.com
console.log(result.groups.text); // 百度输出结果

4.3  ES9正则扩展-反向断言
// 声明字符串let str = 'JS5211314你知道么555啦啦啦';1)正向断言const reg = /\d+(?=啦)/;
const result = reg.exec(str);
console.log(result);2)反向断言const reg = /(?<=么)\d+/;
const result = reg.exec(str);
console.log(result);5.4  ES10-Symbol.prototype.description
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>\s+<a>(.*?)<\/a>\s+<p>(.*?)<\/p>/;
const reg = /<li>.*?<a>(.*?)<\/a>.*?<p>(.*?)<\/p>/gs;
// 执行匹配
let result;
let data = [];
while ((result = reg.exec(str))) {
data.push({ title: result, time: result });
}
// 输出结果
console.log(data);6.  ES11
6.1  ES11-私有属性// 二维数组转换成对象
const result = Object.fromEntries([
["name", "西南石油大学"],
["zhuanYe", "计算机科学与技术, 软件工程, 人工智能"],
]);
console.log(result); // {name: '西南石油大学', zhuanYe: '计算机科学与技术, 软件工程, 人工智能'}
// Map
const m = new Map();
m.set("name", "电子科大");
m.set("zhuanYe", "大数据");
const result = Object.fromEntries(m);
console.log(result); // {name: '电子科大', zhuanYe: '大数据'}
// Object.entries ES8 对象转二维数组
const arr = Object.entries({
name: "红石榴21",
});
console.log(arr); // [["name","红石榴21"]]6.2  ES11-Promise.allSettled方法
let str = "Hello World";
console.log(str);
console.log(str.trimStart());
console.log(str.trimEnd());const arr = ];
console.log(arr.flat()); //
const arr2 = ]];
// 参数为深度 是一个数字
console.log(arr2.flat(2)); //
 调用all 方法,输出结果
 6.3  ES11-String.prototype.matchAll方法
const arr3 = ;
const result = arr3.flatMap((item) => );
console.log(result); //  6.4  ES11-可选链操作符
?.// 创建Symbol
let s = Symbol("西南石油大学");
console.log(s.description); // 西南石油大学6.5  ES11-动态import
html页面
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); // 18
    console.log(this.#weight); // 45kg
}
}
// 实例化
const girl = new Person("尕车", 18, "45kg");
console.log(girl.name);
//   console.log(girl.#age); // error
//   console.log(girl.#weight); // error
girl.intro();app.js
// 声明两个Promise对象
const p1 = new Promise((resolve, reject) => {
setTimeout(() => {
    // resolve("商品数量-1");
    reject("出错啦!");
}, 1000);
});
const p2 = new Promise((resolve, reject) => {
setTimeout(() => {
    resolve("商品数量-2");
}, 1000);
});
// 调用allSettled 方法
// 就算有一个失败,也会都会返回
const result = Promise.allSettled();
console.log(result);
// 调用all 方法
// 两个都成功,才会返回结果
const res = Promise.all();
console.log(res);hello.js
调用allSettled 方法,输出结果6.6  ES11-BigInt类型
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;
// 调用方法
const result = str.matchAll(reg);
// for(let v of result){
//   console.log(v);
// }
// console.log(result);
const arr = [...result];
console.log(arr);6.7  ES11-绝对全局对象globalThis
在html页面中
function main(config) {
// const dbHost = config && config.db && config.db.host;
const dbHost = config?.db?.host;
console.log(dbHost);
}
main({
db: {
    host: "127.0.0.1",
    username: "root"
},
cache: {
    host: "127.0.0.2",
    username: "admin"
},
});输出结果

在node运行中
console.log(globalThis);输出结果
鉴定完毕,欢迎友友们一起交流学习!

来源:https://www.cnblogs.com/liushihong21/p/17678185.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: ES6-ES11最通俗易懂保姆级的笔记!人见人爱,花见花开。赶快动起你发财的小