「这是我参与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"