指数运算符
链判断运算符
// 读取 firstName 需要层层调用获取,稳妥的方法是层层判断下,很麻烦 let firstName = message.body.user.firstName const firstName = (message && message.body && message.body.user && message.body.user.firstName) || 'default'; // es6 引入了“链判断运算符” ?. 简化了写法 () // 链式调用的时候判断,左侧的对象是否为 null或undefined。如果是的,就不再往下运算,而是返回undefined const firstName = message?.body?.user?.firstName || 'default';
注意点:
短路机制
本质上,
?.
运算符相当于一种短路机制,只要?.
左侧是undefined || null
, 那么右侧的表达式就不再运算
括号的影响
如果链有圆括号,链判断运算符只对括号内部有影响;
(a?.b).c
可配合圆括号四则运算符理解
链运算复
?.
三种写法obj?.prop
// 对象属性是否存obj?.[prop]
// 同上func?.(...args)
// 函数或对象方法是否存在
报错场合:
// 构造函数 new a?.() new a?.b() // 链判断运算符的右侧有模板字符串 a?.`{b}` a?.b`{c}` // 链判断运算符的左侧是 super super?.() super?.foo // 链运算符用于赋值运算符左侧 a?.b = c // 右侧不得为十进制数值 // (为了保证兼容以前的代码,允许foo?.3:0被解析成foo ? .3 : 0), // 因此规定如果?.后面紧跟一个十进制数字,那么?.不再被看成是一个完整的运算符,而会按照三元运算符进行处理 foo?.3:0
null
判断运算符// 开发者的原意是,只要属性的值为null或undefined,默认值就会生效,但是属性的值如果为空字符串或false或0,默认值也会生效 const headerText = response.settings.headerText || 'Hello, world!'; // 只有运算符左侧的值为null或undefined时,才会返回右侧的值 const headerText = response.settings.headerText ?? 'Hello, world!'; // ?? 运算符可配合 ?. 一起使用,设置默认值 const animationDuration = response.settings?.animationDuration ?? 300;
注意点:
??
本质是逻辑运算, 它与&& 和 ||
存在优先级,它们一起使用时,必须用括号表明优先级,否则报错
逻辑赋值运算符
||=, &&=, ??=
// 或赋值运算符 x ||= y // 等同于 x || (x = y) // 与赋值运算符 x &&= y // 等同于 x && (x = y) // Null 赋值运算符 x ??= y // 等同于 x ?? (x = y)
运用:
它们的一个用途是,为变量或属性设置默认值。
// 老的写法 user.id = user.id || 1; // 新的写法 user.id ||= 1;
#!
命令
5. 关于vsCode todo插件
配置 ☑️
// NOTE dndn
// INFO: 用来表达一些信息。
// TAG: 用来创建一些标记。
// TODO: todo 示例 (√)
// XXX: 用来标记一些草率实现的地方。在写代码的时候,有些地方需要频繁修改,这时候使用XXX标记。 (√)
// BUG: 用来标记BUG~ (√)
// FIXME: 用来标记一些需要修复的位置,可以快速定位。(√)
评论区