1. 逻辑赋值运算符
逻辑空赋值 (??=)
逻辑与赋值 (&&=)
逻辑或赋值 (||=)
let A // 当 A为 undefined 或者 null 时, ??= 赋值
A ??= 12 // 12
let B = 0 // 当 B为 Boolean(B) === false 时, ||= 赋值
B ||= 12 // 12
let C = 12 // 当 C为 Boolean(C) === true 时, &&= 赋值
C &&= 0 // 0
2. String.replaceAll()
let str = 'hotdog dog'
str.replaceAll('dog', 'cat') // 'hotcat cat'
// 类似replace 正则替换
str.replace(/dog/g, 'cat') // 'hotcat cat'
3. 数字分隔符
let billion = 1_000_000_000;
console.log(billion); //output: 1000000000
4. 私有方法、私有属性
class Auth {
// 私有方法
#getToken() {
return "12345678";
}
isAuth() {
return this.#getToken();
}
}
const auth = new Auth();
auth.getToken(); //output: auth.getToken is not a function
auth.isAuth(); //output: 12345678
class Auth {
// 私有属性 getter
get #getToken() {
return localStorage.getItem('token');
}
// 私有属性 setter
set #setToken(token) {
localStorage.setItem('token', token);
}
set login(token) {
this.#setToken = token;
}
get isAuth() {
return this.#getToken;
}
}
let token = '12345678';
const auth = new Auth();
auth.login = token;
auth.isAuth; //output: 12345678
5. WeakRef 弱引用
顾名思义,WeakRef是对另一个对象的弱引用。只要不是强引用,弱引用的对象就不会保存在内存中。 JavaScript 使用其垃圾收集算法来清除内存中不再被其他对象引用的对象。所以,当我们创建一个 WeakRef 对象时,它可以随时被垃圾回收。
const student = {
name: 'John Doe',
age: 20,
address: {
number: 365,
street: 'Flower street'
}
}
const ref = new WeakRef(student);
ref.deref().age;
//output: 20
如果弱引用在内存中仍然可用,我们可以使用deref()方法来访问它。 尽管 WeakRef 对节省一些内存很有用,但 WeakRef 的作者建议尽可能避免使用它,原因是不同 JavaScript 引擎中垃圾收集器的复杂行为。
6. Promise.any()
这个方法用于返回第一个成功的 promise 。只要有一个 promise 成功此方法就会终止,它不会等待其他的 promise 全部完成。
const pErr = new Promise((resolve, reject) => {
reject("总是失败");
});
const pSlow = new Promise((resolve, reject) => {
setTimeout(resolve, 500, "最终完成");
});
const pFast = new Promise((resolve, reject) => {
setTimeout(resolve, 100, "很快完成");
});
Promise.any([pErr, pSlow, pFast]).then((value) => {
// pFast fulfils first
console.log(value); // 很快完成
})