1,相信大家经常会碰到 “默认值”的问题。比如某个变量没有值时 使用固定的默认值,如:
// 从后端请求 或 其他地方 获取某值
let val = xxx;
// 如果没有值 赋值默认值1
if (!val) val = 1;
// 简写
val = xxx || 1;
如果 val 值可能为0,空字符串,false;上述代码就不能满足了,?? 的用处就来了,如:
// 不用??
if (!val && val !== 0) val = 1;
// 使用??
val = xxx ?? 1;
// ?? 左边为 0 , "",false 时 val取左边 而不是右边 1
?? 表示:只有左侧的值为null或undefined的时候才使用右侧的值。
所以 xxx 为 0 , "",false 时,val 取左边值,而不是右边。
2,可选链操作符 ?.
取对象中的某个属性值,当对象可能为空时,取值经常报错,需要判断,如:
let x = {}; // x是对象时
console.log(x.a) // 直接取值 undefined
let x; // x为undefined 时
console.log(x.a) // 直接取值 则会报错 'a'没有定义
if (x) console.log(x.a); // 先判断再 取属性 防止报错
// 链式取值 ?.
console.log(x?.a) // 先判断了 x中是否有a,没有直接返回 undefined
let x = {a: 1};
console.log(x?.a) // 判断 x中有a,返回 x.a 1
?. 允许读取连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。
网友评论