当前位置: 首页 > news >正文

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

前言:可选链操作符、空值合并操作符(??), 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

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

相关文章:

  • 软考网络工程师需要哪些复习资料?
  • CIPT备考心得分享-下一个考过的就是你
  • 构建集团统一管控体系,低代码派上用场
  • iconfont 使用
  • 4.类的定义,变量类型,方法类型
  • pytorch中一些有关tensor的操作
  • 大数的乘法
  • DQL操作(数据库表数据查询操作)
  • linux共享内存
  • 小波神经网络的基本原理,小波神经网络什么意思
  • 被一位读者赶超,手摸手 Docker 部署 ELK Stack
  • Math类(Java)
  • Android项目中各文件的作用
  • Java比较器(Comparable接口)
  • ESP Insights 支持通过高级筛选进行分组分析
  • @angular/forms 源码解析之双向绑定
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • 《剑指offer》分解让复杂问题更简单
  • 07.Android之多媒体问题
  • Android组件 - 收藏集 - 掘金
  • Docker: 容器互访的三种方式
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Fundebug计费标准解释:事件数是如何定义的?
  • k8s如何管理Pod
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Magento 1.x 中文订单打印乱码
  • 测试如何在敏捷团队中工作?
  • 对象管理器(defineProperty)学习笔记
  • 技术:超级实用的电脑小技巧
  • 看域名解析域名安全对SEO的影响
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 前嗅ForeSpider采集配置界面介绍
  • 再次简单明了总结flex布局,一看就懂...
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • ​低代码平台的核心价值与优势
  • # Apache SeaTunnel 究竟是什么?
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (超详细)语音信号处理之特征提取
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (九)信息融合方式简介
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (转)Unity3DUnity3D在android下调试
  • .Net CF下精确的计时器
  • .net mvc 获取url中controller和action
  • .net MySql
  • .net实现客户区延伸至至非客户区
  • .net中调用windows performance记录性能信息
  • /dev下添加设备节点的方法步骤(通过device_create)
  • @DateTimeFormat 和 @JsonFormat 注解详解
  • @Documented注解的作用
  • @RestControllerAdvice异常统一处理类失效原因
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [BT]BUUCTF刷题第8天(3.26)
  • [Bugku]密码???[writeup]