ES2020新特性,js中的可选链操作符?.

概述

回想一下,我们是如何访问可能含有空值(null或undefined)属性的嵌套对象,比如访问web api 返回结果的user详情,可以使用嵌套的三元运算符像这样:

const userName = response ? (response.data ? (response.data.user ? response.data.user.name : null) : null) : null;

或者使用if语句进行空值检查:

let userName = null;
if(response && response.data && response.data.user){
userName = response.data.user.name;
}

或者写的更好点:

const userName = response && response.data && response.data.user && response.data.user.name;

上面代码中的共同点是,代码有时会非常冗长,并且变得难以格式化和阅读。这就是可选链操作符 ?. 救场的地方, 它提供隐式无效检查使我们的代码更精炼更好。

const userName = response?.data?.user?.name;

语法

可选链操作符 ?. 是在 Javascript ES2020 中引入的,其语法如下:

obj.val?.prop       如果val存在返回 obj.val.prop, 否则 undefined.
obj.func?.(args) 如果func存在返回 obj.func(args) , 否则 undefined.
obj.arr?.[index] 如果array存在返回 obj.array[index] , 否则 undefined.

用法

以user对象为例,学习 ?. 的用法

const user = {
name: "John",
age: 21,
homeaddress: {
country: "USA"
},
hobbies: [{name: "Coding"}, {name: "Cooking"}],
getFirstName: function(){
return this.name;
}
}
对象

访问存在的属性返回值:

console.log(user.homeaddress.country);
// 打印 "USA";

访问不存在的属性会报错:

console.log(user.officeaddress.country);
// throws error "Uncaught TypeError: Cannot read property 'country' of undefined"

使用可选链操作符 ?. 访问不存在的属性。返回 undefined :

console.log(user.officeaddress?.country);
// 打印 "undefined"
方法

调用存在的方法:

console.log(user.getFirstName());
// 打印 "John";

调用不存在的方法会抛出异常

console.log(user.getLastName());
// throws error "Uncaught TypeError: user.getLastName is not a function";

使用可选链操作符 ?. 访问不存在的方法,返回 undefined :

console.log(user.getLastName?.());
// prints "undefined"
数组

访问数组存在的索引返回值:

console.log(user.hobbies[0].name);
// 打印 "Coding";

访问数组不存在的索引抛出异常:

console.log(user.hobbies[3].name);
// throws error "Uncaught TypeError: Cannot read property 'name' of undefined"

使用可选链操作符 ?. 访问数组不存在的索引,返回 undefined

console.log(user.hobbies[3]?.name);
// prints "undefined"

访问不存在的数组,会抛出异常

console.log(user.dislikes[0].name);
// throws error "Uncaught TypeError: Cannot read property '0' of undefined"

使用可选链操作符 ?. 访问不存在的数组,返回 undefined :

console.log(user.dislikes?.[0]?.name);
// prints "undefined"
与空值合并操作符??一起使用

有的时候,我们希望不返回 undefined 而是返回一个默认值,这个时候,我们可以使用空值合并操作符??完成这一工作。

不使用 ?? ,返回 undefined :

const country = user.officeaddress?.country;
console.log(country);
// 打印 "undefined"

与 ?? 合用,返回一个默认值

const country = user.officeaddress?.country ?? "China";
console.log(country);
// 打印 "China"

ES2020新特性链操作符 '?.'和'??'的更多相关文章

  1. ES2020新特性记录

    1.可选链操作符 // oldlet ret = obj && obj.first && obj.first.second// newlet ret = obj?.fi ...

  2. Python3.8新特性-- 海象操作符

    “理论联系实惠,密切联系领导,表扬和自我表扬”——我就是老司机,曾经写文章教各位怎么打拼职场的老司机. 不记得没关系,只需要知道:有这么一位老司机, 穿上西装带大家打拼职场! 操起键盘带大家打磨技术! ...

  3. ES6新特性概览

    本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony( ...

  4. 几个ES6新特性

    ES6是JavaScript语言的下一代标准,已经在2015年6月正式发布了,因为ES6的第一个版本是在2015年发布的,所以又称ECMAScript 2015(简称ES2015).本文主要讲述的是E ...

  5. PHP 7 值得期待的新特性(上)

    这是我们期待已久的 PHP 7 系列文章的第一篇. 或许你已经知道了,我在 PHP 5.0.0 时间轴 提的 RFC (Request For Comments)通过了, PHP 7 成为 PHP 下 ...

  6. 相比于python2.6,python3.0的新特性。

    这篇文章主要介绍了相比于python2.6,python3.0的新特性.更详细的介绍请参见python3.0的文档. Common Stumbling Blocks 本段简单的列出容易使人出错的变动. ...

  7. [转载] C++11新特性

    C++11标准发布已有一段时间了, 维基百科上有对C++11新标准的变化和C++11新特性介绍的文章. 我是一名C++程序员,非常想了解一下C++11. 英文版的维基百科看起来非常费劲,而中文版维基百 ...

  8. 在C++98基础上学习C++11新特性

    自己一直用的是C++98规范来编程,对于C++11只闻其名却没用过其特性.近期因为工作的需要,需要掌握C++11的一些特性,所以查阅了一些C++11资料.因为自己有C++98的基础,所以从C++98过 ...

  9. 你不知道的JavaScript--Item24 ES6新特性概览

    ES6新特性概览 本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代 ...

随机推荐

  1. [对对子队]会议记录5.21(Scrum Meeting8)

    今天已完成的工作 吴昭邦 ​ 工作内容:调整快进按钮 ​ 相关issue:优化流水线加入物品的动画 ​ 相关签入:feat: 快进图标更换,更改第四关材料位置 朱俊豪 ​ 工作内容:调整场景高度和视角 ...

  2. [Beta]the Agiles Scrum Meeting 11

    会议时间:2020.5.26 21:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 issue yjy 帮助解决技术问题 tq 完成评测机新增评测指标 评测部分增加更多评测指标 wjx ...

  3. BUAA 2020 软件工程 热身作业

    BUAA 2020 软件工程 热身作业 Author: 17373051 郭骏 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 第一次作业-热身! ...

  4. logstash处理多行日志-处理java堆栈日志

    logstash处理多行日志-处理java堆栈日志 一.背景 二.需求 三.实现思路 1.分析日志 2.实现,编写pipeline文件 四.注意事项 五.参考文档 一.背景 在我们的java程序中,经 ...

  5. 用cmd命令行创建vue项目模板

    1.进入cmd命令行 输入存放项目的位置 2.通过vue create 项目名称 创建项目 3.选择Manually select features 4.通过空格选中第1.2.5.6.7.去掉8 4. ...

  6. 按照工业标准1英寸=25.4mm,而在电子元件成像领域Sensor尺寸1英寸=16mm。

    按照工业标准1英寸=25.4mm,而在电子元件成像领域Sensor尺寸1英寸=16mm. 我们平常所说的CCD/CMOS的尺寸,实际上是指Sensor对角线的长度,这一点跟我们平常所说的屏幕尺寸是一样 ...

  7. gas-station leetcode C++

    There are N gas stations along a circular route, where the amount of gas at station i isgas[i]. You ...

  8. 01_WPF概述

    目录 Windows 图形演化 高级API 分辨率无关性 WPF体系结构 我的微信公众号 Windows 图形演化 在 WPF 之前,windows 开发一直使用本质上相同的显示技术.每个传统 win ...

  9. pycharm基本使用与破解

    一.pycharm基本使用 pycharm这款ide软件虽然功能强大,但正因为他的强大,所以小白在刚使用这款软件时上手会有点难度,今天我们就来介绍一下ptcharm的基本使用. 1.基本配置 我们安装 ...

  10. k8s入坑之路(10)kubernetes coredns详解

    概述 作为服务发现机制的基本功能,在集群内需要能够通过服务名对服务进行访问,那么就需要一个集群范围内的DNS服务来完成从服务名到ClusterIP的解析. DNS服务在kubernetes中经历了三个 ...