let a = 1;
let b = 2;
a &&= b;
console.log(a) // 变量 ‘a‘ 的输出为 2。
该行a&&= b类似于下面给出的代码块:
if(a) {
a = b;
}
这个逻辑运算符是说,如果变量a有一个真值(因为它持有一个非零值),那么a应该为变量b分配的值。这就是为什么当我们这样做时console.log(a),变量的值a计算为 2 而不是 1。
let a = 1;
let b = 2;
a ||= b;
console.log(b); // 变量 ‘a‘ 的输出为 1。
该运算符与&&=运算符相反。在这种情况下,变量a将仅等于变量b并且仅当变量a具有假值时。上面的代码块相当于下面给出的代码:
if (!a) {
a = b;
}
let a;
let b = 2;
a ??= 1;
console.log(a) // 变量 ‘a‘ 的输出为 1。
// 此代码块类似于上面给出的代码。
// if(a === null || a === undefined) {
// a = 1
// }
在给定的示例中,变量 ‘a‘ 的值计算为undefined因此,if条件计算为true并且 ‘a‘ 被赋值为 1。
// without regex
let str = ‘JS is everywhere. JS is amazing!‘;
console.log(str.replace(‘JS‘, ‘JavaScript‘)); // the output would be ‘JavaScript is everywhere. JS is amazing!‘
// with regex
let str = ‘JS is everywhere. JS is amazing!‘;
console.log(str.replace(/JS/g, ‘JavaScript‘)); // the output would be ‘JavaScript is everywhere. JavaScript is amazing!‘.
使用该replaceAll方法,消除了对正则表达式的需要。请看下面的代码:
let str = ‘JS is everywhere. JS is amazing!‘;
console.log(str.replaceAll(‘JS‘, ‘JavaScript‘)); // the output would be ‘JavaScript is everywhere. JavaScript is amazing!‘.
let number = 1_000_000_000; // one billion
console.log(number) // 1000000000 (the number would remain an integer)
const p1 = new Promise(resolve => setTimeout(resolve, 500, ‘First‘));
const p2 = new Promise(resolve => setTimeout(resolve, 800, ‘Second‘));
const p3 = Promsie.reject(1);
const promises = [p1, p2, p3];
Promise.any(promises)
.then(result => {
console.log(result);
}) // the result would be ‘First‘ because that‘s the promise, that is fulfilled first.
.catch(e => {
console.log(e);
})
如果没有一个承诺得到履行,那么我们将得到一个AggregateError. 为了处理AggregateError,我们将在catch语句之后定义一个then语句。
then&catch的使用
注意:WeakRef只应在特定情况下使用,并应尽可能避免使用。
让我们通过一个例子来理解:
const weakRefFunc = () => {
const obj = new WeakRef({
name: ‘JavaScript‘
});
console.log(obj.deref().name);
}
const test = () => {
new Promise(resolve => {
setTimeout(() => {
weakRefFunc();
resolve();
}, 3000)
})
new Promise(resolve => {
setTimeout(() => {
weakRefFunc();
resolve();
}, 5000)
})
}
test();
该deref方法返回被持有的目标,如果目标被垃圾回收,则返回undefined。
在这个例子中,变量obj是被持有的弱引用。
第一次在函数weakrefFunc内部test调用时,保证会打印“JavaScript”,但第二次调用时,不能保证会打印“JavaScript”,因为变量obj可能会被垃圾回收将其视为弱引用。
Finalizers
Finalizers主要用于搭配,WeakRef但也可以单独使用。Finalizers告诉对象何时被垃圾回收。让我们通过一个例子来理解这一点:
→ 首先,我们将使用该FinalizationRegistry方法创建Finalizers。
const registerFinalizer = new FinalizationRegistry(data => console.log(data));
const obj = {‘name‘: ‘JavaScript‘};
registerFinalizer.register(obj, ‘obj is collected now!‘)
现在,变量registerFinalizer是一个包含register我们将要使用的方法的对象。
registerFinalizer.register需要 2 个参数。第一个是垃圾回收要监视的对象,第二个是我们希望在对象被垃圾回收时向控制台显示的消息。
现在,当obj垃圾收集器收集变量时,会显示一条消息“obj is collected now!” 将打印到控制台。
原文地址:https://javascript.plainenglish.io/javascript-2021-new-features-429bc050f4e8
原文:https://www.cnblogs.com/lhongsen/p/14846373.html