认识可选链和双问号语法

2023-11-21 01:50
文章标签 语法 认识 问号 可选链

本文主要是介绍认识可选链和双问号语法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

    • 可选链操作符 —— Optional chaining operator
    • 双问号操作符 —— nullish coalescing operator

我们都知道一个新的ECMAScript标准的发布需要经过五个阶段,分别是Stage 0-Stage 4阶段,每个阶段都需要 TC39的审批和全体成员的一致同意才能提交至下一个阶段。本文中提到的特性是处于Stage 3 || Stage 4阶段。 在这里插入图片描述
所以说以下提到的新特性很快就可以为我们程序员造福了,下面先来了解一下有哪些新特性值得我们兴奋的😉

可选链操作符 —— Optional chaining operator

可选链?啥玩意儿?……这个名词你可能没听过,但是!使用情形你一定历历在目。且往下看:
你一定碰到这种情形:当需要访问对象内部深层的属性值的时候,你是不是这么写的:

//定义一个对象
data() {return {obj: {userInfo: {name: "hzq",tel: "1234567778",other: { name: "hzq2", title: "名字" }},title: "哈哈"},}}
//获取对象内部的other对象的name属性值值
mounted(){console.log(this.obj && this.obj.useInfo && this.obj.userInfo.other && this.obj.userInfo.other.name)
}
//this.obj写的有点累...

在访问obj.userInfo.other.name之前,你必须要确保obj和obj.userInfo和obj.userInfo.other的值都是非null且不是undefined。假设其一是null或者undefined的,那么直接访问obj.userInfo.other.name就可能产生错误,报错为Cannot read property 'name' of undefined,这时你就挠头了…
有了可选链式,你只要这么写就可以抛弃上面又长又冗余的代码了:

//定义一个对象
data() {return {obj: {userInfo: {name: "hzq",tel: "1234567778",other: { name: "hzq2", title: "名字" }},title: "哈哈"},}}
//可选链获取对象内部的other对象的name属性值值
mounted(){//wow,It's impossibleconsole.log(this.obj?.userInfo?.other?.name)
}

看起来是不是简单明了。获取msg表达式会有短路计算,即如果obj或obj.userInfo或obj.userinfo.other其一是nullundefined的话,就不往后执行了,直接返回undefined,当访问链条上可能存在的属性却不存在时,?.操作符将会使表达式更短和更简单,将会返回undefined
可选链的使用还远远不止获取属性这么简单,它还可以访问数组。
在movie对象中,actors数组可以是空的,甚至是缺失的,因此必须添加额外的条件来判空。

function getLeadingActor(movie) {if (movie.actors && movie.actors.length > 0) {return movie.actors[0].name}
}

if (movie.actors && movies.actors.length > 0) {...}条件主要判断movie包含actors属性,并且此属性至少有一个actor
使用可选链之后,代码明显简洁得多:

function getLeadingActor(movie) {return movie.actors?.[0]?.name
}

actors?. 确保actors属性存在, [0]?.确保数组中存在第一个actor
再来!

const arr=[1,2,3]
//  之前的写法
if(arr.length){arr.map(res=>{//处理你的罗晋})
}
// 可选链的写法arr?.map(item=>{//处理你的逻辑})

注意:
目前新项目vue-cli的搭建的可以直接使用可选链和双问号。旧项目的话需要借助插件解析可选链和双问号写法:
babel-plugin-proposal-optional-chaining 插件可以帮助我们将可选链式的代码转化,下面我们看看可选链式代码转义后是啥样的?

const babel = require('@babel/core')
const code = 'const obj = {}; const baz = obj?.foo?.foo1'
const output = babel.transformSync(code, {plugins: ["@babel/plugin-proposal-optional-chaining"]
})
console.log(output.code)
var _obj$foo;
const obj = {};
const baz = obj === null || obj === void 0 ? void 0 : (_obj$foo = obj.foo) === null || _obj$foo === void 0 ? void 0 : _obj$foo.foo1;

如何使用:通过babel配置使用可选链

注:首先检查你的项目依赖中的babel版本,如果你的babel版本低于7,那么很遗憾,你得先解决babel版本升级的问题。比如下图:
在这里插入图片描述
为了让你更方便的升级到babel 7,官方提供了一个工具babel-upgrade,对于已有的项目,只需要运行一行命令就可以升级到7版本以上了:

npx babel-upgrade --write --install
在这里插入图片描述

当你运行完npx babel-upgrade --write --install这个的时候如果出现以下报错:在这里插入图片描述
请执行以下代码:

npm install --save @babel/runtime-corejs2

解决了版本问题那就开始吧!

第一步 安装依赖

npm install --save-dev @babel/plugin-proposal-optional-chaining -S

第二步 然后在.babelrc或者babel.config.js中这加入这个插件(plugins属性放在JSON顶层)
在这里插入图片描述
注:编辑器是vscode的话,需要在vscode的setting中配置

"javascript.validate.enable": false

这样你就可以肆无忌惮地写可选链式代码了 👏👏👏

双问号操作符 —— nullish coalescing operator

在开发中,我们时常会遇到这样的情形:变量判断为空的时候,我们用三元运算符去给变量设置默认值,是这么写:

let c = a ? a : b // 写法1
let c= a || b // 写法2

这两种写法其实是有一个弊端的,它们都会过滤掉所有的假值,如:(0,' ',false),这些值或许是正常情况下有效的输入值,平时实际生产环境可能不会遇到,为此忽略了这个问题。
为解决此问题,“nulllish”横空出世,用 ?? 表示,它可以在第一项仅为nullundefined时才设置默认值。

let c = a ?? b
//等价于
let c = a !== undefined  && a !== null ? a : b

再举个栗子:

let a = null
let b = a ?? 500   // 500
let c = 0 // 真实有效的输入值
let d =c ?? 9000  // 0
//如果是传统写法
let x = c ? c:9000  // 9000

如何使用双问号?
其实跟可选链一样,也是配置好babel就可以了。安装插件:

npm install --save-dev @babel/plugin-proposal-nullish-coalescing-operator

然后在.babelrc或者babel.config.js中这加入这个插件(plugins属性放在JSON顶层)
在这里插入图片描述
完美 🤙🤙🤙🤙🤙🤙

欢迎各位小伙伴评论留言!

这篇关于认识可选链和双问号语法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/398962

相关文章

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

每天认识几个maven依赖(ActiveMQ+activemq-jaxb+activesoap+activespace+adarwin)

八、ActiveMQ 1、是什么? ActiveMQ 是一个开源的消息中间件(Message Broker),由 Apache 软件基金会开发和维护。它实现了 Java 消息服务(Java Message Service, JMS)规范,并支持多种消息传递协议,包括 AMQP、MQTT 和 OpenWire 等。 2、有什么用? 可靠性:ActiveMQ 提供了消息持久性和事务支持,确保消

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

C++语法知识点合集:11.模板

文章目录 一、非类型模板参数1.非类型模板参数的基本形式2.指针作为非类型模板参数3.引用作为非类型模板参数4.非类型模板参数的限制和陷阱:5.几个问题 二、模板的特化1.概念2.函数模板特化3.类模板特化(1)全特化(2)偏特化(3)类模板特化应用示例 三、模板分离编译1.概念2.模板的分离编译 模版总结 一、非类型模板参数 模板参数分类类型形参与非类型形参 非类型模板

Java基础回顾系列-第一天-基本语法

基本语法 Java基础回顾系列-第一天-基本语法基础常识人机交互方式常用的DOS命令什么是计算机语言(编程语言) Java语言简介Java程序运行机制Java虚拟机(Java Virtual Machine)垃圾收集机制(Garbage Collection) Java语言的特点面向对象健壮性跨平台性 编写第一个Java程序什么是JDK, JRE下载及安装 JDK配置环境变量 pathHe

Hibernate框架中,使用JDBC语法

/*** 调用存储过程* * @param PRONAME* @return*/public CallableStatement citePro(final String PRONAME){Session session = getCurrentSession();CallableStatement pro = session.doReturningWork(new ReturningWork<C

ORACLE语法-包(package)、存储过程(procedure)、游标(cursor)以及java对Result结果集的处理

陈科肇 示例: 包规范 CREATE OR REPLACE PACKAGE PACK_WMS_YX IS-- Author : CKZ-- Created : 2015/8/28 9:52:29-- Purpose : 同步数据-- Public type declarations,游标 退休订单TYPE retCursor IS REF CURSOR;-- RETURN vi_co_co

ElasticSearch的DSL查询⑤(ES数据聚合、DSL语法数据聚合、RestClient数据聚合)

目录 一、数据聚合 1.1 DSL实现聚合 1.1.1 Bucket聚合  1.1.2 带条件聚合 1.1.3 Metric聚合 1.1.4 总结 2.1 RestClient实现聚合 2.1.1 Bucket聚合 2.1.2 带条件聚合 2.2.3 Metric聚合 一、数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如:

react笔记 8-16 JSX语法 定义数据 数据绑定

1、jsx语法 和vue一样  只能有一个根标签 一行代码写法 return <div>hello world</div> 多行代码返回必须加括号 return (<div><div>hello world</div><div>aaaaaaa</div></div>) 2、定义数据 数据绑定 constructor(){super()this.state={na

SpringMVC-1.认识及配置

SpringMVC是一个基于请求驱动的Web框架,和structs一样是目前最优秀的基于MVC框架,现在的项目一般都使用SpringMVC代替Structs。 MVC模式中,Model是应用程序中用于处理应用程序数据逻辑的部分,通常模型对象在数据库中存取数据。View是应用程序中处理数据显示的部分,通常视图是依据模型数据创建。Controller是应用程序中处理用户交互的部分。通常控制器负责从视