首页 > 其他分享 >#Js篇: 链式判断运算符 ?.和Null判断运算符 ??和逻辑赋值运算符||= &&= ??=

#Js篇: 链式判断运算符 ?.和Null判断运算符 ??和逻辑赋值运算符||= &&= ??=

时间:2024-11-30 09:03:16浏览次数:8  
标签:默认值 undefined settings Js 运算符 && null

链式判断运算符 ?.

?.运算符,直接在链式调用的时候判断,左侧的对象是否为null或undefined。如果是的,就不再往下运算,而是返回undefined。

链判断运算符?.有三种写法。

obj?.prop // 对象属性是否存在
obj?.[expr] // 同上
func?.(…args) // 函数或对象方法是否存在
下面是obj?.[expr]用法的一个例子。

let hex = "#C0FFEE".match(/#([A-Z]+)/i)?.[1];

上面例子中,字符串的match()方法,如果没有发现匹配会返回null,如果发现匹配会返回一个数组,?.运算符起到了判断作用。

下面是?.运算符常见形式,以及不使用该运算符时的等价形式。
a?.b
// 等同于
a == null ? undefined : a.b

a?.[x]
// 等同于
a == null ? undefined : a[x]

a?.b()
// 等同于
a == null ? undefined : a.b()

a?.()
// 等同于
a == null ? undefined : a()

Null 判断运算符 ??

读取对象属性的时候,如果某个属性的值是null或undefined,有时候需要为它们指定默认值。常见做法是通过||运算符指定默认值。

第一种弊端 所有的false都会取默认值
const headerText = response.settings.headerText || 'Hello, world!';
const animationDuration = response.settings.animationDuration || 300;
const showSplashScreen = response.settings.showSplashScreen || true;

上面的三行代码都通过||运算符指定默认值,但是这样写是错的。开发者的原意是,只要属性的值为null或undefined,默认值就会生效,但是属性的值如果为空字符串或false或0,默认值也会生效。

只有为null or undefined才会取默认值
const headerText = response.settings.headerText ?? 'Hello, world!';
const animationDuration = response.settings.animationDuration ?? 300;
const showSplashScreen = response.settings.showSplashScreen ?? true;

上面代码中,默认值只有在左侧属性值为null或undefined时,才会生效。


这个运算符的一个目的,就是跟链判断运算符?.配合使用,为null或undefined的值设置默认值。

const animationDuration = response.settings?.animationDuration ?? 300;

上面代码中,如果response.settings是null或undefined,或者response.settings.animationDuration是null或undefined,就会返回默认值300。也就是说,这一行代码包括了两级属性的判断。

??本质上是逻辑运算,它与其他两个逻辑运算符&&和||有一个优先级问题,它们之间的优先级到底孰高孰低。优先级的不同,往往会导致逻辑运算的结果不同。

现在的规则是,如果多个逻辑运算符一起使用,必须用括号表明优先级,否则会报错。

(lhs && middle) ?? rhs;
lhs && (middle ?? rhs);

(lhs ?? middle) && rhs;
lhs ?? (middle && rhs);

(lhs || middle) ?? rhs;
lhs || (middle ?? rhs);

(lhs ?? middle) || rhs;
lhs ?? (middle || rhs);

逻辑赋值运算符 ||=、&&=、??=

// 或赋值运算符
x ||= y
// 等同于
x || (x = y)

// 与赋值运算符
x &&= y
// 等同于
x && (x = y)

// Null 赋值运算符
x ??= y
// 等同于
x ?? (x = y)
// 老的写法
user.id = user.id || 1;

// 新的写法
user.id ||= 1;

标签:默认值,undefined,settings,Js,运算符,&&,null
From: https://blog.csdn.net/weixin_47075554/article/details/144134159

相关文章

  • json-rules-engine engine 简单说明
    engine包含了存储,执行规则,提交事件以及维护状态,比如添加以及一处fact,添加、删除、更新rule,同时还包含添加operator,添加以及维护conddition执行//runtheengineawaitengine.run()//withconstantfactsawaitengine.run({userId:1})const{results,//r......
  • JAVA开源毕业设计 课程智能组卷系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T009,文末自助获取源码\color{red}{T009,文末自助获取源码}......
  • JAVA开源毕业设计 医院电子病历管理系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T008,文末自助获取源码\color{red}{T008,文末自助获取源码}......
  • 运算符的应用
    '''运算符的应用:1.基本加减乘除2.赋值3.比较4.逻辑6.成员运算符'''#加减乘除#字符串的加法:两个字符串拼接#数字加字符串,报错#list加法:将多个list合并为一个#减法操作:只支持Number类型的运算#乘法操作,*'''1.number类型的乘法2.str*int:str重复int次'''......
  • JS 预编译代码实例分析
    了解JavaScript引擎在执行代码过程中所做的一些行为是非常必要的,这有助于我们在遇到莫名其妙的调用时,能够大致定位问题所在。在我学习了预编译的相关知识,并基于该文章,引用其中的一段代码,结合“变量提升”、“函数提升”的小示例,对其进行详细的分析,算是留作一份笔记巩固记忆、加......
  • Linux系统上使用nvm管理nodejs和npm版本操作
    安装nvm由于Github的访问性问题,所以我们不使用Github安装,而是使用Gitee安装,使用的Gitee仓库为:https://gitee.com/RubyMetric/nvm-cn安装命令为:bash-c"$(curl-fsSLhttps://gitee.com/RubyMetric/nvm-cn/raw/main/install.sh)"安装后验证:重启shell或者执行source~/.nvm/n......
  • vue.js学习(day 13)
    .sync修饰符 App.vue <template><divclass="app"><button@click="isShow=true">退出按钮</button><!--:visible.sync=>:visible+@update:visible--><BaseDialog:visible.......
  • 271.大学生HTML5期末大作业 —【精美的响应式自适应绿色茶叶公司】 Web前端网页制作 h
    目录一、更多推荐二、网页简介三、网页文件四、网页效果五、代码展示1.html2.CSS3.JS六、总结1.简洁实用2.使用方便3.整体性好4.形象突出5.交互式强一、更多推荐欢迎来到我的CSDN主页!您的支持是我创作的动力!Web前端网页制作、网页完整代码、大学生期末大作......
  • Nuxt.js 应用中的 render:response 事件钩子
    title:Nuxt.js应用中的render:response事件钩子date:2024/11/29updated:2024/11/29author:cmdragonexcerpt:render:response是一个在Nuxt.js中与服务器端渲染(SSR)相关的钩子,它会在请求的响应发送之前被调用。这个钩子的目的是让开发者可以在响应发送之前对响应进......
  • ThreeJs-04详解材质与纹理
    一.matcap材质这个材质不会受到光照影响,但是如果图片本身有光就可以一直渲染这个图片本来的样子,用来将一个图片纹理渲染到物体上的材质代码实现加载模型后,开启纹理渲染,并把它的材质变为这个材质,并且贴上纹理图二.Lambert材质Lambert网格材质是Three.js中最基本和常用的材......