广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript中? ?、??=、?.和 ||的区别浅析
  • 822
分享到

JavaScript中? ?、??=、?.和 ||的区别浅析

js ?.和 ||区别js ?.是什么意思js 空值合并操作符 2022-11-13 14:11:29 822人浏览 薄情痞子
摘要

目录前言?? 与 || 的区别空值合并操作符 ??可选链操作符 ?. 空值赋值运算符(??=)补充:?. 链判断运算符总结前言 undefined和nu

前言

undefined和null是两个比较特殊的数据类型,是不能用点操作符去访问属性的,否则将会报错

    let a;
    console.log(a?.name); //undefined
    console.log(a.name); //报错

    let obj = {};
    console.log(obj.name); //undefined
    console.log(obj?.name?.a); //undefined
    console.log(obj.name.a); //报错

?? 与 || 的区别

相同点:

?? 和 || 的用法相同,都是前后是值,中间用符号连接,根据前面的值来判断最终是返回前面的值还是后面的值。

A ?? B

A || B

不同点:

判断的方法不同:

使用 ?? 时,只有A为 null 或者 undefined 时才会返回 B;

使用 || 时,A会先转化为布尔值判断,为true时返回A , false 返回B

// ??
    console.log(undefined ?? 2);  // 2
    console.log(null ?? 2);   // 2
    console.log(0 ?? 2);  // 0
    console.log("" ?? 2);   // ''
    console.log(true ?? 2);  // true
    console.log(false ?? 2);   // false
 
// ||
    console.log(undefined || 2);   // 2
    console.log(null || 2);     // 2
    console.log(0 || 2);        // 2
    console.log("" || 2);     // 2
    console.log(true || 2);     // true
    console.log(false || 2);      // 2

空值合并操作符 ??

只有当左侧为null 或者undefined 时,才会返回右侧的值

可选链操作符 ?. 

?. 允许读取连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。

?. 操作符的功能类似于. 链操作符,不同之处在于,在引用为空,即 null 或者 undefined 的情况下不会引起错误,该表达式短路返回值。 

    const obj = { a: { b: [{ name: "obj" }] } };
 
    // 原本的写法
    console.log(obj && obj.a && obj.a.b.length && obj.a.b[0].name); //obj
 
    // 可选链写法
    console.log(obj?.a?.b?.[0]?.name); // obj
    console.log(obj?.b?.c?.d); // undefined

?.可以和 ?? 运算符结合使用 

    const obj = { a: { name: "obj" } };
 
    console.log(obj?.a?.b ?? "hello world"); // hello world

空值赋值运算符(??=)

当??=左侧的值为null、undefined的时候,才会将右侧变量的值赋值给左侧变量.其他所有值都不会进行赋值 

    let a = "你好";
 
    let b = null;
    let c = undefined;
    let d = 0;
    let e = "";
    let f = true;
    let g = false;
 
    console.log((b ??= a)); // 你好
    console.log((c ??= a)); // 你好
    console.log((d ??= a)); // 0
    console.log((e ??= a)); // ''
    console.log((f ??= a)); // true
    console.log((g ??= a)); // false
 
    console.log(b); // 你好
    console.log(c); // 你好
    console.log(d); // 0
    console.log(e); // ''
    console.log(f); // true
    console.log(g); // false

补充:?. 链判断运算符

链判断运算符?. 允许开发人员读取深度嵌套在对象链中的属性值,而不必验证每个引用。当引用为空时,表达式停止计算并返回 undefined。

let travelPlans = {
  destination: 'DC',
  monday: {
    location: 'National Mall',
    budget: 200,
    host: null
  }
}
let res = travelPlans?.tuesday?.location ?? "locahost"; // => locahost
let res2 = travelPlans?.host; // => undefined

这个是什么操作呢??

这个location是哪里来的呢?这个tuesday又是哪里来的呢?就算不是外面的travelPlans这个对象里也没有location和tuesday啊!!!经过询问大佬后得

let res = travelPlans?.tuesday?.location; 
<=等价=> 
let res = travelPlans&& travelPlans.tuesday&& travelPlans.tuesday.location

作用就是判断这个对象(travelPlans)下的(tuesday)下的(location)是否为null或者undefined,当其中一链为null或者undefined时就返回undefined,这样即使中间缺少一个属性也不会报错,双问号后面接的就是默认值。

总结

到此这篇关于javascript中? ?、??=、?.和 ||区别的文章就介绍到这了,更多相关js中? ?和??=和?.和 ||区别内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaScript中? ?、??=、?.和 ||的区别浅析

本文链接: https://www.lsjlt.com/news/171645.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript中? ?、??=、?.和 ||的区别浅析
    目录前言 与 || 的区别空值合并操作符 可选链操作符 . 空值赋值运算符(=)补充:. 链判断运算符总结前言 undefined和null是两个比较特...
    99+
    2022-11-13
    js ?.和 ||区别 js ?.是什么意思 js 空值合并操作符
  • 浅析git中push和commit的区别
    在Git中,push和commit是两个非常重要的术语,它们都是版本控制系统中的操作命令。但是,这两个命令之间存在一些区别。本文将会介绍Git push和commit的区别。Git Commit在Git中,commit是指将更改记录在本地存...
    99+
    2023-10-22
  • Android中WebChromeClient和WebViewClient的区别浅析
    1、WebViewClient就是帮助WebView处理各种通知、请求事件的,具体来说包括:onLoadResource 、onPageStart 、onPageFinish ...
    99+
    2022-06-06
    Android
  • 浅析java中Pair和Map的区别
    目录核心java配对实现Pair类AbstractMap.SimpleEntry 和 AbstractMap.SimpleImmutableEntryApache CommonsVa...
    99+
    2022-11-11
  • Vue.js和Vue.runtime.js区别浅析
    目录区别HTML Compilertemplaterender()codesandbox.io区别  Vue.jsVue.runtime.js体积最大比Vue.js小40%...
    99+
    2022-11-13
  • Spring中@Validated和@Valid区别浅析
    目录基本概念@Valid和@Validated 批注主要区别什么是嵌套验证?总结基本概念 Spring Validation 验证框架对参数的验证机制提供了@Validated(Sp...
    99+
    2022-11-13
  • 浅析php中==与===的区别
    在PHP中,有时候我们需要比较两个变量是否相等。为了实现这个功能,我们可以使用等于操作符“==”或者全等操作符“===”。虽然两个操作符都可以完成相等比较,但是它们之间还是存在一些差别。在本文中,我们将分别介绍“==”和“===”的具体作用...
    99+
    2023-05-14
    === == php
  • Java泛型中<?>和<T>的区别浅析
    目录一、定义1、T 代表一种类型2、是通配符,泛指所有类型二、使用1、T 一般有两种用途2、<> 的限制用途3、三种泛型限定三、总结1、从定义上看2、从用途上看补充:场景...
    99+
    2022-12-19
    java泛型?和T的区别 java 泛型 T ? Java 泛型 ?
  • 浅析Oracle和Mysql分页的区别
    一、Mysql使用limit分页 select * from stu limit m, n; //m = (startPage-1)*pageSize,n = pageSize ...
    99+
    2022-10-18
  • 浅析Mysql和Oracle分页的区别
    目录mysql使用limit进行分页oracle使用rownum进行分页Mysql与Oracle级联查询Mysql省市区级联查询Mysql与Oracle插入数据存在修改不存在新增MySQL使用limit进行分页 sele...
    99+
    2022-12-07
    Mysql和Oracle分页区别 MysqlOracle分页
  • MySQL去重中distinct和group by的区别浅析
    今天在写业务需要对数据库重复字段进行去重时,因为是去重,首先想到的是distinct关键字。于是一小时过去了。。。。(菜鸟一个,大家轻点骂) 我把问题的过程用sql语句演示给大家演示一下 首先我使用的是myBATis-p...
    99+
    2022-11-09
  • MySQL去重中distinct和group by的区别浅析
    今天在写业务需要对数据库重复字段进行去重时,因为是去重,首先想到的是distinct关键字。于是一小时过去了。。。。(菜鸟一个,大家轻点骂) 我把问题的过程用sql语句演示给大家演示...
    99+
    2022-11-13
    mysql去重distinct和group by mysql distinct group by MySQL去重复
  • Vue3中ref与toRef的区别浅析
    1. ref是复制,视图会更新 如果利用ref将某一个对象中的某一个属性值变成响应式数据 我们修改响应式数据是不会影响原始数据的; 同时视图会跟新。 ref就是复制 复制是不会影响原...
    99+
    2022-11-12
  • Vue中created与mounted的区别浅析
    大多数人在谈论生命周期钩子时会感到困惑的一件事是 created 和 mounted 之间的区别。有着相似的名称,觉得应该做同样的事情,但还是有一些细微的差别。 首先,created...
    99+
    2022-11-13
  • 浅析thinkphp和vuejs的区别是什么
    随着前端技术的不断发展,越来越多的开发者开始采用前后端分离的开发模式。相比于传统的后端渲染模式,前后端分离的模式可以提高应用的可扩展性、可维护性和开发效率。在前后端分离的模式中,后端负责提供API接口,前端则负责渲染页面和用户交互。而在前后...
    99+
    2023-05-14
    php thinkphp Vue
  • 浅析Python字符串中的r和u的区别
    目录1.r(R)2.u(U)补充参考文献Python中字符串前面我们经常看到加r(R)或u/(U)的前缀,而这两个符号是什么意思呢? 1.r(R) r意为raw,表示不包含转义字符的...
    99+
    2022-11-12
  • 浅析Python中元祖、列表和字典的区别
    1、列表(list)   list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目。   列表中的项目应该包括在方括号中,这样Python就知道你是指明一个列表。一旦你创建了一个列表,就...
    99+
    2022-06-04
    元祖 字典 区别
  • Mysql中undo、redo与binlog的区别浅析
    目录前言【undo log】 【redo log】 【binlog】 总结前言 MySQL中有六种日志文件,分别是:重做日志(redo log)、回滚日志(undo log)、二进制...
    99+
    2022-11-12
  • 简单对比:github和git的区别浅析
    在开发软件和网站时,版本控制是至关重要的一步,尤其是现在的开发环境变得更加复杂而庞大。Git 是一个流行的分布式版本控制系统,而 Github 则是一个基于 Git 的代码托管服务,也是开源社区中的重要组成部分。尽管它们的名字很相似,但它们...
    99+
    2023-10-22
  • SwiftUI学习之state和Binding的区别浅析
    @state 绑定值的状态,其属性的修饰官方推荐使用private.上代码(ps:这里没用private 进行修饰,是为了演示区别) import SwiftUI struct ...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作