Js中.?和??语法(可选链操作符和双问号操作符)

这篇具有很好参考价值的文章主要介绍了Js中.?和??语法(可选链操作符和双问号操作符)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Tips:为啥起这么一个标题呢,因为我自己当时看代码,看到这个语法的时候就感觉有些遗忘,但是又不知道他叫做什么名字,所以只能直接搜索.?和??这样搜索,哈哈哈相信不少人可能跟我一样,不知道他叫做什么名字嘿嘿。

1.可选链操作符(.?)

可选链操作符( ?. )允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?. 操作符的功能类似于 . 链式操作符,不同之处在于,在引用为空[null]或者 [undefined] 的情况下不会引起错误,该表达式短路返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined

当尝试访问可能不存在的对象属性时,可选链操作符将会使表达式更短、更简明。在探索一个对象的内容时,如果不能确定哪些属性必定存在,可选链操作符也是很有帮助的。

举例

当一个对象的引用或函数可能是undefined或者null时(数组也行),可选链操作符提供了一种方法来简化对被链接对象的值的访问。

以前的操作是这样的:

let name = obj.person && obj.person.name;

使用可选链操作符的操作是这样的:

let name =obj.person?.name;

再来一个比较完整的例子:

我们想获取obj对象中person对象的name属性,

如果我们的obj是如下定义,那么是可以正常取到值得:

let obj = {
   person: {
       name: '张三'
   }
}
/* 首先我们不进行判断直接取值*/
let name = obj.person.name;
console.log("name:", name)

打印输出:

js ?.,javascript,前端,开发语言

以上是正常情况,那如果我们定义的obj对象中没有person对象

代码如下:

let obj = {
            // person: {
                name: '张三'
            // }
        }
/*没有person对象的情况下不进行判断直接取值*/
let name = obj.person.name;
console.log("name:", name)

 js ?.,javascript,前端,开发语言

那么在实际的开发中呢,我们可能不能确定对象中到底有没有想要的属性,这时候我们就需要自行判断,那还是上面的例子,我们加入判断:

let obj = {
            // person: {
                name: '张三'
            // }
        }
/*没有person对象的情况下用常规判断方式取值*/
let name = obj.person && obj.person.name;
console.log("name:", name)

 js ?.,javascript,前端,开发语言

以上是常规判断方式,试想一下,如果对象嵌套层级很深,这样写是很麻烦的,所有就有了下面这种判断方式:可选链式操作符:

let obj = {
            // person: {
                name: '张三'
            // }
        }
/*没有person对象的情况下用可选链操作符判断进行取值*/
let name =obj.person?.name;
console.log("name:", name)

 js ?.,javascript,前端,开发语言

通过使用 ?. 操作符取代 . 操作符,JavaScript 会在尝试访问 obj.person.name 之前,先隐式地检查并确定 obj.person 既不是 null 也不是 undefined。如果obj.personnull 或者 undefined,表达式将会短路计算直接返回 undefined

 更详细的内容可自行去MDN进行查询哈。

MDN:可选链.?

1.双问好操作符(??)

说到这个得先介绍一下双问好操作符解决了之前哪些操作符的弊端了。

当我们需要判断一个参数是否有值,根据前者然后给他进行赋值,我们第一个想到的肯定是三元运算符boolean ? trueValue : falseValue

如果有一个user对象:

{
  "name": "kaiser",
  "hobby": {
    "sports": {
      "summer": "basketball",
      "winter": "sleep"
    }
  }
}

我们要获取summer这样字段

if (user && user.hobby && user.hobby.sports && user.hobby.sports.summer) {
  return user.hobby.sports.summer
}

好像有点冗长, 这才三层,如果更深的层级就更加刺激了,不对,再来!

try {
  return user.hobby.sports.summer
} catch(e) {
  return undefined
}

这样能一劳永逸解决任何长度的层级,但是还不够优雅。不对,再来!

import get from 'lodash/get'

const result = get(user, 'hobby.sports.summer')

只要任何一个环节出现问题,都会返回一个undefined,但是这需要使用第三方库,不够优雅。不对,再来!

祭出杀手锏,可选链:

return user?.hobby?.sports?.summer

是不是感觉超凡脱俗了很多呢?

上面的例子,如果其中一个属性是null或者undefined,不会报错,而是会返回undefined,比如查询的user对象是下面三种情况:

{
  "hobby": {}
}

{
  "hobby": null
}

{
  "hobby": {
    "sports": "basketball"
  }
}

那么得到的返回值都是undefined

可选链其他写法:文章来源地址https://www.toymoban.com/news/detail-810175.html

obj?.prop // 对象的点号判断 user?.hobby?.sports
obj?.[expr] // 对象的方括号判断 user?.['hobby']?.['sport']
arr?.[index] // 数组判断 userList?.[12]?.name
func?.(args) // 方法判断 user?.run?.('1hours')

到了这里,关于Js中.?和??语法(可选链操作符和双问号操作符)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【PostgreSQL】函数与操作符-比较函数和操作符

    PostgreSQL中的比较函数和操作符用于比较两个表达式的值。它们的作用是确定表达式的值是否满足某种条件,例如等于、大于、小于等。 比较函数是一个接受两个参数的函数,返回一个布尔值,表示两个参数是否满足某种条件。例如,equal()函数用于判断两个参数是否相等,

    2024年01月17日
    浏览(31)
  • 初始C语言——详细讲解操作符以及操作符的易错点

    初始C语言——详细讲解操作符以及操作符的易错点

     第一章 “C“浒传——初识C语言(更适合初学者体质哦!)  第二章 详细认识分支语句和循环语句以及他们的易错点   第三章 初阶C语言——特别详细地介绍函数  第四章 初始C语言——详细地讲解数组的内容以及易错点  第五章  初始C语言——详细讲解操作符以及操

    2024年02月13日
    浏览(17)
  • 【c语言操作符系列1】^(异或操作符)讲解和多种例题详解

    【c语言操作符系列1】^(异或操作符)讲解和多种例题详解

    目录 一、^ 是什么(^称为异或) 二、^的规律(特点) 三、可利用^秒杀的常见例题(重点) 1、消失的数字  2、不一样的人生密码 3、交换两个数(不能创建中间变量) 4、找出只出现一个的两个数字 是一种操作符, 针对二进制异或而言的 ,两个数对应的二进制位相同,异或

    2024年02月16日
    浏览(9)
  • 【C语言】中的位操作符和移位操作符,原码反码补码以及进制之间的转换

    【C语言】中的位操作符和移位操作符,原码反码补码以及进制之间的转换

    欢迎大家来到c语言知识小课堂,今天的知识点是操作符和进制 同样都是数字1111,不同进制下数字的大小不同,第二行代表的是其各位数字十进制下的大小,将各位数字的十进制大小相加即1111在这个进制下转化为十进制的大小,从图中我们可以看出来 进制的定义:从右往左

    2024年02月22日
    浏览(13)
  • ES6...扩展操作符骚操作

    复制和合并数组变得更为简洁。不需要使用 concat() 方法或 slice() 方法,一个 … 操作符已经足够: 将数组作为一个需要单独一个个传入参数的函数的参数 对象属性展开复制 如果存在相同的值 后者覆盖前者 合并对象 类似于object.assign 不过,扩展属性并不总能生成与 Object.as

    2024年02月14日
    浏览(9)
  • 断言操作符介绍

    断言操作符介绍

    目录 1.延时操作符(##) 1.1 ##m 1.2 ##[m:n] 2.蕴含操作符(|=,|-) 2.1 |=操作符 2.2 |-操作符  3 重复操作符 ([*m][-m][=m]) 3.1 连续重复操作符([*m][*m:n]) 3.2 跟随重复操作符([-m][-m:n]) 3.3 非连续重复操作符([=m]) 3.4 小结 4 SVA 4.1 与或非 4.2 动态控制函数 4.3 SVA内嵌函数 4.4 S

    2024年02月10日
    浏览(8)
  • <C语言> 操作符

    <C语言> 操作符

    加法(+):用于将两个操作数相加。 减法(-):用于将第一个操作数减去第二个操作数。 乘法(*):用于将两个操作数相乘。 除法(/):用于将第一个操作数除以第二个操作数。 取模(%):用于求两个操作数相除的余数。 乘法、除法和取模具有相同的优先级,高于加法

    2024年02月12日
    浏览(9)
  • 【C】操作符详解

    【C】操作符详解

    今天给大家带来一篇关于C语言操作符的详细介绍,在C语言中操作符主要有以下几种: 1.算术操作符 2.移位操作符 3.位操作符 4.赋值操作符 5.单目操作符 6.关系操作符 7.逻辑操作符 8.逗号表达式 9.条件操作符 9.下标引用,函数调用和结构成员 接下来给大家详细介绍! + - * /

    2024年02月12日
    浏览(9)
  • Python 操作符

    Python提供了各种操作符用于执行不同类型的操作,例如算术操作、比较操作、逻辑操作等。下面是Python中常见的操作符: 1. 算术操作符:    - `+`:加法    - `-`:减法    - `*`:乘法    - `/`:除法    - `%`:取模(求余数)    - `**`:幂运算    - `//`:取整除(向下取整)

    2024年02月05日
    浏览(9)
  • JavaScript 操作符

    在 JavaScript 中,有一些操作符可以使代码更简洁、易读和高效。以下是一些常见的操作符: ?. 是 可选链操作符(optional chaining operator) 。 ?. 可选链操作符 用于访问可能为空或未定义的属性或方法,它允许我们安全地访问嵌套对象的属性,如果中间的属性为空或未定义,则不

    2023年04月19日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包