好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

ES6+ 可选链操作符

ES6+ 可选链操作符

1. 前言

在 ES5 中对于安全地访问对象的深嵌套 属性 时,首先检查它的上 一个 属性 是否存在,然后才能 获取 属性 的值,否则就会报错:

  var  obj  =   {  } 
console .  log  ( obj . a ) 		 // undefined 
console .  log  ( obj . a . b ) 	 // Uncaught TypeError: Cannot read property 'b' of undefined 
 

上面的 代码 中,obj 是 一个 对象,在 获取 obj 对象的 属性 a 时, 属性 a 没有被定义所以返回 undefined,第 3 行 获取 obj 对象 a 下的 b,由于 obj 上没有 a 属性 ,再 获取 a 上的 b 属性 就会报错。一般这样的情况,在程序中需 要做 前置验证,大部分情况会借助 && 来完成。

  var  obj  =   {  } 
 var  b  =  obj . a  &&  obj . a . b
console .  log  ( b ) 	 // undefined 
 

上面的 代码 中第 2 行首先会判断 obj.a 的值,如果不为空则继续执行 obj.a.b 否则返回 undefined 。这样做虽然能保证程序的健壮性,但当嵌套的对象很深时,则要对每一层进行验证,这样不利于阅读,而且容易出现程序上的 错误 。

针对上面的场景, ES2020 最新的版本给出了它的 解决方 案 —— 可选链操作符。我们可以直接在浏览器的控制台中进行测试,那什么是可选链操作符呢?本节我们来学习这个 ES6 的新语法。

2. 方法 详情

可选链操作符使用 ?. 来表示,可以判断操作符之前 属性 是否有效,从而链式读取对象的 属性 或返回 undefined 。

作用与 . 操作符类似。不同的是 ?. 如果对象链上的引用是 null 或者 undefined 时, . 操作符会像前言中的例子抛出 一个 错误 ,而 ?. 操作符则会按照短路计算的方式进行处理,返回 undefined 。可选链操作符也可用于 函数 调用 ,如果操作符前的 函数 不存在,也将会返回 undefined 。下面我们来看它的使用语法:

2.1 基本语法

语法使用:

 obj ?  . prop
obj ?  .  [ expr ] 
arr ?  .  [ index ] 
func ?  .  ( args ) 
 

参数解释:

参数 描述 prop 对象上的 属性 expr 对象上的 属性 可以是 一个 表达式 index 对数组使用时,可以接数组的位置 args 对 函数 使用时,可以接收传入的参数

查看更多关于ES6+ 可选链操作符的详细内容...

  阅读:35次

上一篇

下一篇

第1节:ES6+ 简介    第2节:ES6 环境配置    第3节:ES6+ let    第4节:ES6+ const    第5节:ES6+ 展开语法    第6节:ES6+ 剩余参数    第7节:ES6+ 解构赋值    第8节:ES6+ 模版字符串    第9节:ES6+ 箭头函数    第10节:ES6+ 数值扩展    第11节:ES6+ isFinite()&isNaN()    第12节:ES6+ Number 对象的方法    第13节:ES6+ Math 对象的扩展    第14节:ES6+ includes()    第15节:ES6+ 字符串的扩展    第16节:ES6+ startsWith()    第17节:ES6+ endsWith()    第18节:ES6+ repeat()    第19节:ES6+ padStart()    第20节:ES6+ padEnd()    第21节:ES6+ trim()    第22节:ES6+ Array.from()    第23节:ES6+ of()    第24节:ES6+ find()和findIndex()    第25节:ES6+ copyWithin()    第26节:ES6+ fill()    第27节:ES6+ isArray()    第28节:ES6+ 对象的扩展    第29节:ES6+ flat()    第30节:ES6+ 可选链操作符    第31节:ES6+ Object.is()    第32节:ES6+ Object.assign()    第33节:ES6+ Object.keys()    第34节:ES6+ Object.values()    第35节:ES6+ Object.entries()    第36节:ES6+ 数据结构扩展    第37节:ES6+ Set    第38节:ES6+ WeakSet    第39节:ES6+ Map    第40节:ES6+ WeakMap    第41节:ES6+ Symbol    第42节:ES6+ for...of    第43节:ES6+ 迭代协议    第44节:ES6+ 实现一个简版的 Promise    第45节:ES6+ Promise 基础    第46节:ES6+ Promise 进阶    第47节:ES6+ Generator 基础    第48节:ES6+ Generator 函数应用    第49节:ES6+ async/await    第50节:ES6+ Class 前置知识    第51节:ES6+ Class    第52节:ES6+ Proxy    第53节:ES6+ Reflect(一)    第54节:ES6+ Reflect(二)    第55节:ES6+ 模块化(一)    第56节:ES6+ 模块化(二)    第57节:ES6实战1-实现Vue3 reactive 源码    第58节:ES6实战2-实现 Vue3 effect 源码    第59节:ES6 实战2-封装请求    第60节:ES6+ 实战3-代码整洁之道    第61节:ES6 Map原理分析    第62节:ES6module语法加载importexport    第63节:ES6的循环与可迭代对象示例详解