1、逻辑赋值运算符
逻辑赋值运算符:
??=
、&&=
、||=
let a = true
let b = true
//a &&= b //a=a&&b true
//a ||= b //a=a||b true
let obj = {
introduction: 0
}
obj.introduction ??= "这个人很懒" //obj.introduction = obj.introduction ?? "这个人很懒"
console.log(obj.introduction) //0
2、数字分隔符
这个新特性是为了方便程序员看代码而出现的,如果数字比较大,那么看起来就不是那么一目了然。
分隔符不仅可以分隔十进制,也可以分隔二进制或十六进制的数据,非常好用。
const number = 1_000_000_000_000
const binary = 0b1010_0101_1111_101
const octonary = 0o12_34_56
const hex = 0xA1_B2_C3
console.log(number, binary, octonary, hex) //1000000000000 21245 42798 10597059
3、replaceAll
所有匹配都会被替代项替换。模式可以是字符串或正则表达式,而替换项可以是字符串或针对每次匹配执行的函数。并返回一个全新的字符串。
//将所有wish替换成twj
const str =
"I wish to wish the wish you wish to wish, but if you wish the wish the witchwishes, I won't wish the wish you wish to wish. ";
const newstr = str.replaceAll("wish", "twj");
console.log(newstr);
4、Promise.any
只要参数实例有一个变成fulfilled状态,包装实例就会变成fulfilled状态;如果所有参数实例都变成rejected状态,包装实例就会变成rejected状态。
Promise.any()
跟Promise.race()
方法很像,只有一点不同,就是Promise.any()
不会因为某个Promise变成rejected状态而结束,必须等到所有参数Promise变成rejected状态才会结束。
//登录-会员联盟系统(沃尔玛、华润万家、盒马)
let ajax1 = function () {
return new Promise((resolve, reject) => {
reject("沃尔玛")
})
}
let ajax2 = function () {
return new Promise((resolve, reject) => {
reject("华润万家")
})
}
let ajax3 = function () {
return new Promise((resolve, reject) => {
resolve("盒马")
})
}
//只要有一个返回了fulfilled状态的promise对象,那就会进then(谁最快谁进),没有就进catch
Promise.any([ajax1(), ajax2(), ajax3()]).then(res => {
console.log(res) //华润万家
}).catch(err => {
console.log("err", err)
})
5、WeakRef
在一般情况下,对象的引用是强引用的,这意味着只要持有对象的引用,它就不会被垃圾回收。只有当该对象没有任何的强引用时,垃圾回收才会销毁该对象并且回收该对象所占的内存空间。
而WeakRef允许您保留对另一个对象的弱引用,而不会阻止弱引用对象被垃圾回收。
let target = i;
let wr = new WeakRef(target);
WeakRef实例对象有一个
deref()
方法,如果原始对象存在,该方法返回原始对象;如果原始对象已经被垃圾回收机制清除,该方法返回undefined。
let target = i;
let wr = new WeakRef(target);
let obj = wr.deref(); //得到原始对象
if (obj) { // target未被垃圾回收机制清除
// ...
}
6、FinalizationRegistry
清理器注册表功能FinalizationRegistry,用来指定目标对象被垃圾回收机制清除以后,所要执行的回调函数。
let obj = {
name: "twj"
}
let registry = new FinalizationRegistry(data => {
console.log("销毁了", data)
})
registry.register(obj, "11111111111111")
//registry.unregister(obj) //取消注册
obj = null //销毁了 11111111111111
使用案例:
let registry = new FinalizationRegistry(data => {
console.log("销毁了", data)
})
let wmap = new WeakMap()
let like = new WeakRef(document.getElementById("like"))
wmap.set(like.deref(), { click: 0 })
like.deref().onclick = function () {
let times = wmap.get(like.deref())
times.click++
console.log(times.click)
}
setTimeout(() => {
registry.register(like.deref(), wmap.get(like.deref()).click)
document.body.removeChild(like.deref())
}, 2000)
上一篇文章 | 下一篇文章 |
---|---|
ES11新特性 | ES13新特性 |