逻辑赋值运算符
1 2 3 4 5 6 7 8
| x || (x = y); x ||= y;
x && (x = y); x &&= y;
x ?? (x = y); x ??= y;
|
1 2 3 4 5 6 7 8 9 10 11 12
| const updateID = user => {
if (!user.id) user.id = 1
user.id = user.id || 1
user.id ||= 1 }
|
1 2 3 4 5 6
| function setOpts(opts) { opts.cat ??= 'meow' opts.dog ??= 'bow'; }
setOpts({ cat: 'meow' })
|
数字分隔符
数字太长的话可读性就会变差,有了分隔符会好些
1 2 3 4 5 6 7 8
| 1_000_000_000 101_475_938.38
let fee = 123_00; let fee = 12_300; let amount = 12345_00; let amount = 123_4500; let amount = 1_234_500;
|
1 2 3
| 0.000_001 1e10_000 0xA0_B0_C0;
|
Promise.any 和 AggregateError
Promise.any()
接收一个 Promise 可迭代对象,只要其中的一个 Promise 成功,就返回那个已经成功的 Promise 。如果可迭代对象中没有一个 Promise 成功(即所有的 Promise 都失败/拒绝),就返回一个失败的 Promise 和 AggregateError
类型的实例,它是 Error 的一个子类,用于把单一的错误集合在一起。本质上,这个方法和 Promise.all() 是相反的。
1 2 3 4 5 6 7 8 9 10 11 12
| Promise.any([ fetch('https://v8.dev/').then(() => 'home'), fetch('https://v8.dev/blog').then(() => 'blog'), fetch('https://v8.dev/docs').then(() => 'docs') ]).then((first) => { console.log(first); }).catch((error) => { console.log(error); });
|
String.prototype.replaceAll
1 2 3 4 5 6 7 8 9 10
|
'x'.replace('', '_');
'xxx'.replace(/(?:)/g, '_');
'xxx'.replaceAll('', '_');
|
WeakRefs 和 FinalizationRegistry 对象
使用 WeakRef
类可以创建对对象的弱引用,在对象被垃圾收集后可以运行使用 FinalizationRegistry
创建的自定义终结器(finalizers),两者可以独立使用,也可以一起使用,具体的规范可以参考:tc39/proposal-weakrefs
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| let target = {}; let wr = new WeakRef(target);
const registry = new FinalizationRegistry(heldValue => { });
registry.register(myObject, "some value", myObject);
registry.unregister(myObject);
|