提高开发效率的JavaScript技术(二)

85 阅读2分钟

「这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战」。

空值合并运算符 ??

空值合并操作符( ?? )是一个逻辑操作符,当左侧的操作数为 null或者undefined时,返回其右侧操作数,否则返回左侧操作数

let name = undefined ?? "lmw"
let age = null ?? 18
console.log(name);   // "lmw"
console.log(age);   // 18

与逻辑或操作符(||)不同,|| 会在左侧操作数为假值(例如 ''、0、``NaN、``false、undefined、null)时返回右侧操作数

let name1 = "" ?? 'lmw';
let name2 = "" || 'yy';
console.log(name1);   // ""
console.log(name2);   // "yy"

let age1 = 0 ?? 18;
let age2 = 0 || 18;
console.log(age1);   // 0
console.log(age2);   // 18

可选链 ?.

可选链操作符 ( ?. ) 允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?. 操作符的功能类似于 . 链式操作符,不同之处在于,在引用为 null 或者 undefined 的情况下不会引起错误,该表达式短路返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined。

let obj = {
    message: {
        name: 'lmw',
        sayHi() {
            return 'hi';
        }
    }
}

在之前的语法中,想获取到深层属性或方法,需要做前置校验,否则很容易出现 Uncaught TypeError: Cannot read property... 这种错误,影响整个程序的运行

let name = obj && obj.message && obj.message.name;
console.log(name);   // 'lmw'

使用可选链操作符 ( ?. )

let name = obj?.message?.name;
console.log(name);   // 'lmw'

可选链中的 ? 表示如果问号左边表达式有值, 就会继续查询问号后面的字段 可选链不能用于赋值

let obj = {};
obj?.message?.name = 'lmw';   // 报错

String.prototype.replaceAll()

replaceAll()返回一个新字符串,新字符串中所有满足 pattern 的部分都会被替换。pattern可以是一个字符串或一个正则表达式

let str = 'aabbcc'.replaceAll('b', '*');
console.log(str);   // 'aa**cc'

使用正则表达式搜索值时,它必须是全局的

'aabbcc'.replaceAll(/b/, '*');   // 报错

修改如下

'aabbcc'.replaceAll(/b/g, '*');   // "aa**cc"