ES6-11特性
ES6特性
let
- 不能重复声明变量
- 块级作用域
1
2
3
4
5for (let i = 0; i<length; i++) {
btns[i].onclick = function () {
console.log("hello" + i);
}
} - 不存在变量提升
- 不影响作用域链
const
- 常量需要赋初值
- 常量的值不能修改
- 块级作用域
- 数组、对象的值可以修改,因为引用地址不变
变量的解构赋值
1 | let [a, b, c] = anotherArray; |
模板字符串
1 |
|
对象的简化书写
1 | let name = "kong"; |
箭头函数
- 适合与this无关的
1
2
3
4
5
6let func = (a,b) => {
return a + b;
}
let func = a => a**2;
let func = (a,b) => a+b; - this 是静态的,始终指向函数声明时所在的作用域的this,call/apply/bind 都无法改变
1
2
3
4
5
6
7
8
9
10
11// 例子
ad.addEventListener("click", function () {
setTimeout(() => {
// this 指向箭头函数声明时所在的作用域的 this 也就是 ad 事件源对象
this.style.background = 'pink';
}, 2000);
});
let arr = [1,2,3,4,5,6]
let res = arr.filter(item => item % 2 === 0); - 箭头函数不能作为构造器实例化对象,即不能使用new操作符
- 不能使用 argument 对象
函数参数默认设置
1 | function add(a, b, c = 10) { |
rest参数
- rest 参数须放最后
func(a, b, ...args)
1
2
3
4
5
6
function data(...args) {
console.log(args)
}
data('kong', 'de', 'wen');
扩展运算符
1 | function sayHello() { |
Symbol
- 确保对象属性使用唯一标识符,不会发生属性冲突
1 | let s = Symbol(); |
1 |
|
迭代器
1 | let youxi = ['a', 'b']; |
1 | // 自定义迭代器遍历数据 |
生成器函数
1 | fucntion * gen() { |
1 | // 生成器函数实例 解决回调地狱 |
Promise
1 | // 实例化 Promise 对象 |
Promise 封装读取文件
1 | const fs = require('fs'); |
Promise 封装Ajax
1 | const promise = new Promise(function(resolve, reject){ |
Promise.prototype.then 链式调用
then() 返回一个 Promise 对象
对象的状态由回调函数执行结果决定
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18const = result = p.then((value) => {
// 1. 返回非 promise 对象 字符串 则 then()返回的promise对象状态为成功,值为该文本
return 'hello文本一个';
// 2. 抛出错误 则 then()返回的promise对象状态为失败,值为该错误
throw new Error('出错了');
throw '出错了';
// 3. 返回 promise 对象, then()返回的promise对象状态根据返回的promise对象状态
return new Promise((resolve, reject) => {
resolve('成功')
})
}, (reason) => {
// 该方法可以省略
})
console.log(result);
result.then(value => {
console.log(value); // hello文本一个
})多次Ajax请求
解决回调地狱
1 | // 定义 ajax 请求:传入回调函数 success 和 fail |
Set 集合
1 | let s = new Set(); |
Map
- 键值对,键不限于字符串,可以任意类型
1 | let m = new Map(); |
class
1 | class Phone{ |
Number 的扩展
1 | // Number.EPSILON |
Object对象方法扩展
1 | // 类似 === |
模块化
- 防止命名冲突
- 代码复用
- 高维护性
模块暴露
1 | // module1.js 暴露 |
模块引入
1 | <!-- 引入 --> |
babel 模块化代码转换
1 | npm init -y |
ES7特性
1 | const arr = [1,2,3,4]; |
ES8特性
async/await
- async 函数返回值为 Promise对象
- promise对象的结果由 async 函数执行返回值决定
1 | // async |
async/await 封装 ajax
1 | function sendAjax(url) { |
Object对象方法扩展
1 | const school = { |
ES9特性
对象中 rest参数和扩展运算符
1 | function connect({host, post, ...user}) { |
正则扩展
1 | // 命名捕获分组 |
ES10特性
1 | // 二维数组转对象 与 Objec.entries()相反 |
ES11特性
私有属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14class Person{
name; // 公有
#age; // 私有属性
constructor(name, age) {
this.name = name;
this.#age = age;
}
myAge(){
console.log(this.#age); // 内部可以访问
}
}
const p = new Person('kong', 12);
console.log(p.age); // 报错
p.myAge(); // 12Promise.allSettled()/Promise.all()
1
2
3
4
5
6// 返回成功值 和 一个对象数组 适用获取各个 promsie的状态
const result = Promise.allSettled([promise1, promise2]);
// 两个 promise 都成功才成功 适用各个 promse 都成功才下步执行操作
const res = Promise.all([promise1, promise2]);String.prototype.matchAll()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20let str = `<ul>
<li>
<a>电影</a>
<p>上映时间</p>
</li>
<li>
<a>电影</a>
<p>上映时间</p>
</li>
</ul>`
const reg = /<li>.*?<a>(.*?)<\/a>.*?<p>(.*?)<\/p>/sg;
// 返回可迭代对象
const result = str.matchAll(reg);
for (let v of result) {
console.log(v);
}
const arr = [...result];
console.log(arr);可选链操作符(?.)
1
2
3
4
5
6
7
8
9
10
11
12function 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'
}
})动态import
1
2
3
4
5
6
7
8
9
10
11
12
13// hello.js
export function hello(){
console.log('say hello');
}
// main.js
btn.addEventListener('click', function(){
// 返回 promise 对象
import('./hello.js').then(module => {
module.hello(); // say hello
})
})BigInt
1
2
3
4
5
6
7// 大整形
let n = 1234n;
BigInt(123); // 123n
// 大整数运算
let max = Number.MAX_SAFE_INTEGER;
BigInt(max) + BigInt(10);globalThis
忽视环境始终指向全局对象
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 CrazyKong!
评论