前言
各位读者好,我正在努力学习前端中,这里是我的学习笔记分享,希望能够对大家有用。
我学习的视频链接是尚硅谷ES6
此外,我还有其它前端内容的笔记,大家有需要的可以自行查找。
ES6
let关键字
特点
- let变量不能重复声明,var可以重复声明
- 作用域为块级
- 不能变量提升
- 不影响作用域链的效果
const 定义常量
注意:数组内容可以改变,但数组的地址不可以改变
变量的解构赋值
模板字符串
简化对象
箭头函数
特点:
- this是静态的.this始终指向函数声明时所在的作用域下的this的值
- 不能作为构造实例化的对象
- 不能使用arguments变量
- 可以简写
注意:箭头函数适合与this 无关的回调、定时器、数组的方法的回调函数,不适合与 this 有关的回调、事件回调、对象的方法。
函数参数默认值
rest参数
扩展运算符
扩展运算符的运用
Symbol的使用
ES6引入了一种新的原始数据类型 Symbol,表示独一无二的值。它是JavaScript语言的第七种数据类型,是一种类似于字符串的数据类型。
Symbol特点
- Symbol的值是唯一的,用来解决命名冲突的问题
- Symbol值不能与其他数据进行运算
- Symbol定义的对象属性不能使用for…in循环遍历,但是可以使用
Reflect.ownKeys来获取对象的所有键名
Symbil创建对象属性
Symbol的内置属性
共有11个内置属性,这里是详细介绍
迭代器
生成器函数
生成器的函数参数
生成器函数例子
<!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>Document</title>
</head>
<body>
<script>
//异步编程
//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);
},1000)
}
function two(){
setTimeout(()=>{
console.log(222);
},2000)
}
function three(){
setTimeout(()=>{
console.log(333);
},3000)
}
//生成器函数
function * gen(){
yield one();
yield two();
yield three();
}
//调用生成器函数
let iterator = gen();
iterator.next();
iterator.next();
iterator.next();
iterator.next();
//模拟获取 用户数据 商品数据 订单数据
function getUsers(){
setTimeout(()=>{
let data = '用户数据'
//调用next方法,并且将数据传入
iterator1.next(data)
},1000)
}
function getOrders(){
setTimeout(()=>{
let data = '订单数据'
iterator1.next(data)
},1000)
}
function getGoods(){
setTimeout(()=>{
let data = '商品数据'
// iterator1.next(data)
},1000)
}
function * ma(){
let users =yield getUsers();
console.log(users);
let orders = yield getOrders();
console.log(orders);
yield getGoods();
}
//调用生成器函数
let iterator1=ma();
iterator1.next();
</script>
</body>
</html>
Promise
基本使用
<!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>Document</title>
</head>
<body>
<script>
//实例化Promise对象
const p = new Promise(function(resolve,reject){
setTimeout(function(){
//正确读取
let data = '数据库中的用户数据'
resolve(data)
//失败读取
let err = '数据读取失败'
reject(err)
},1000);
});
//调用Promis对象的then方法,成功调用前一个函数,失败调用后一个函数
p.then(function(value){
console.log(value);
},function(reason){
console.log(reason)
})
</script>
</body>
</html>
用Promise封装
//导入fs模块
const fs = require('fs')
//使用Promise 封装
const p =new Promise(function(resolve,reject){
fs.readFile('./文件1.md',(err,data)=>{
//如果失败
if(err) reject(err);
//成功
resolve(data);
})
});
p.then(function(value){
console.log(value.toString());
},function(reason){
console.log("读取失败");
});
用Promise对AJAX的操作
<!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>Document</title>
</head>
<body>
<script>
//接口地址:https://api.apiopen.top/getJpke
const p = new Promise((resolve,reject)=>{
//1.创建对象
const xhr = new XMLHttpRequest();
//2.初始化
xhr.open("GET","https://api.apiopen.top/getJpke")
//3.发送
xhr.send();
//4.绑定事件,处理响应结果
xhr.onreadystatechange = function(){
//判断
if(xhr.readyState === 4)
//判断响应状态码200-299
if(xhr.status>=200&&xhr.status<=299)
//成功
resolve(xhr.response);
else
//失败
reject(xhr.status);
}
});
p.then(function(value){
console.log(value);
},function(reason){
console.log(reject);
});
</script>
</body>
</html>
Promise的then属性的使用
<!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>Document</title>
</head>
<body>
<script>
//创建Promise对象
const p = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('用户数据')
reject('发生错误')
},1000)
});
//调用then方法 then返回的结果是Promise对象,对象状态有回调函数执行结果决定
//1.返回结果是非Promise类型的属性,状态成功,返回值为对象成功的值
// const result =p.then(value=>{
// console.log(value);
// // //1.非promise类型的属性
// // // return '123';
// // //2.是promise对象 , 返回值为then方法返回的值
// // return new Promise((resolve,reject)=>{
// // // resolve('ok');
// // reject('error')
// // });
// //3.抛出错误
// // throw new Error('错误');
// },function(reason){
// console.warn(reason);
// });
//链式调用改变回调地狱的问题
p.then(value=>{
}).then(value=>{
})
console.log(result);
</script>
</body>
</html>
promise的catch对象的使用方法
<!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>Document</title>
</head>
<body>
<script>
const p = new Promise((resolve,reject)=>{
setTimeout(()=>{
//设置p对象为失败,并设置失败值
reject('失败')
},1000);
})
//不用第一个参数
p.catch(function(reason){
console.warn(reason);
})
</script>
</body>
</html>
set集合
用集合实现数组去重、交并补
map
class类
class类中的静态成员
继承与class继承
继承
class继承
get与set
数值扩展
对象扩展的方法
模块化
暴露汇总
分别暴露
统一暴露
默认暴露
引用汇总
模块化建议单独设置一个js文件,作为引入文件的集合
模块化兼容
ES7
include
**
ES8
async函数
await表达
async函数与await表达的结合,是异步看样子是同步一样,处理速度加快
扩展对象的方法
ES9
rest 运算符
正则扩展
命名捕获分组
命名捕获分组自身的语法是 (?…),比普通的分组多了一个 ? 字样,其中 name 的起法就和你平时起变量名一样即可(不过在这里关键字也可用)。反向引用一个命名分组的语法是 \k,注意命名分组同样可以通过数字索引来反向引用
反向断言
dotALL模式
ES10
对象扩展
字符串扩展 trimSta与trimEnd
数组扩展 flat 与flatMap
ES11
私有属性
私有属性只能出现在类内部,不能出现下类外面,即便是类外引用也不行
promise.allSettled
string.prototype.matchAll
这是为了批量匹配正则表达式
可选链操作
动态import函数引用
BigInt属性
gobalThis绝对全局变量
改变量字如其名,无论在什么情况下,都是指向全局变量。