JS中新逻辑赋值运算符使用(?.、? ?、| |=、&&=)

发布于:2023-01-04 ⋅ 阅读:(369) ⋅ 点赞:(0)

前言:可选链操作符、空值合并操作符(??), AND(&&)和 OR(||)运算符等的使用让我们的代码更干净简洁。在此之前必须先了解falsy 值、 nullish 值这两个概念。

  • falsy 值(虚值):是在布尔值Boolean上下文中认定为 false 的值。在 JavaScript 中只有 8 个 falsy 值,包括undefined、null、false、空字符串 (双引号 ""、单引号’’、反引号 ``)、NaN、0。
  • nullish 值:要么是 null 要么是 undefined 。nullish 值总是 falsy 。

一、可选链操作符( ?. ):允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。

简单来说,可以把?.  中的这个?看成是是否存在该属性,然后再链式调用。如果?前面的值为nullish值(null或者undefined)则直接返回undefined,不会再往下执行链式调用。看代码理解:

let res = {
  say: "lemon say",
  data: {
    age: 18,
    name: "lemon",
    sex: "woman"
  }
};

// 判断是否存在name属性并赋值
if (res && res.data && res.data.name) {
    this.title = res.data.name
}
// 改成使用?.方法,如果?前面的res或者是data为nullish值(null或者undefined)则直接返回undefined,不会再往下执行链式调用
this.title = res?.data?.name    // lemon
this.sex = res?.result?.sex    // undefined

二、空值合并操作符(??):当左侧的操作数为nullish值(null或者undefined),返回其右侧操作数,否则返回左侧操作数。

听起来好像和或运算符(||)没啥区别,实际上是有区别的。空值合并操作符(??)是根据nullish值来判断,而或运算符(||)是根据falsy 值来判断。

let count = 0;
let name = "";

// 或运算符(||)
let num = count || 666;
let str = name || "lemon";
console.log(num);     // 666
console.log(str);     // lemon

// 空值合并操作符(??)只要左边不是null或者undefined就返回左边
let num = count ?? 666;
let str = name ?? "lemon";
console.log(num);     // 0
console.log(str);     // ""

1.逻辑空分配(?? =):x ??= y

逻辑空值运算符左到右操作,仅在x为nullish值(null或者undefined)时才将值分配x,x如果不是nullish值时压根就不会执行y了,更不存在赋值操作一说。如果y是一个函数,它也不会被调用。

let count = 3;
let name = null;
count ??= 666;
name ??= "lemon";
console.log(count); // 3
console.log(name); // lemon

2.空运算符与空值合并操作符(??)同时使用:

let res = {
  say: "lemon",
  data: {
    age: 18,
    name: "lemon" // data 的 sex 属性未有定义
  }
};

// 当 res?.data?.sex的值为nullish值时,则将woman赋值给sex
let sex = res?.data?.sex ?? 'woman'
console.log(sex) // woman

 3. 空值合并操作符(??)不能直接与 AND(&&)和 OR(||)操作符组合使用。

null || undefined ?? "lemon"; // 抛出 SyntaxError
true || undefined ?? "lemon"; // 抛出 SyntaxError

三、逻辑或分配(||=):x ||= y

仅在左侧表达式为 falsy 值(虚值) 时才赋值。就是或运算符(||)与赋值运算符同时使用。

四、逻辑与分配(&& =):x &&= y

逻辑赋值运算符仅在左侧为真时才赋值。就是逻辑与 (&&)与赋值运算符同时使用。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到