【C#开发者必看】空传播链式调用的3大应用场景与陷阱

第一章:C# 6 空传播链式调用概述

C# 6 引入了一项极具实用性的语法特性——空传播运算符(Null-Conditional Operator),它极大地简化了在访问对象成员时对 null 值的显式检查。通过使用 `?.` 运算符,开发者可以安全地进行链式调用,避免因中间对象为 null 而引发 `NullReferenceException`。

空传播运算符的基本语法

空传播运算符 `?.` 允许在调用属性、方法或元素时,自动判断左侧操作数是否为 null。若为 null,则整个表达式返回 null;否则继续执行右侧操作。
// 示例:安全访问用户姓名
string name = user?.Name;
// 若 user 为 null,则 name 也为 null,不会抛出异常

List<string> roles = user?.Roles?.ToList();
// 链式调用中每一步都进行 null 检查

与空合并运算符结合使用

通常,空传播运算符会与空合并运算符 `??` 配合,提供默认值以增强代码健壮性。
// 提供默认名称
string displayName = user?.Name ?? "未知用户";
  • 减少冗长的 if-null 判断语句
  • 提升代码可读性和维护性
  • 适用于属性、索引器、方法调用和事件订阅

常见应用场景对比

场景传统写法C# 6 空传播写法
获取用户邮箱user != null ? user.Email : nulluser?.Email
调用可能为空的方法if (handler != null) handler();handler?.Invoke()
该特性不仅优化了防御性编程模式,还使 LINQ 查询等复杂链式调用更加简洁安全。

第二章:空传播操作符的核心机制与语法解析

2.1 空传播操作符的基本语法与运行原理

空传播操作符(Nullish Propagation Operator)是一种用于安全访问嵌套对象属性的语法特性。它能在链式访问中,一旦遇到 `null` 或 `undefined` 时立即返回 `undefined`,避免程序抛出错误。
基本语法形式
该操作符通常以 `?.` 表示,可用于属性访问、函数调用等场景:
const userName = user?.profile?.name;
上述代码等价于手动检查每层是否存在,极大简化了深层取值逻辑。
运行机制解析
当引擎执行 `obj?.prop` 时,会首先评估 `obj` 是否为 `null` 或 `undefined`。若是,则跳过后续访问,直接返回 `undefined`;否则继续访问 `prop` 属性。
  • 支持方法调用:func?.()
  • 支持数组元素访问:arr?.[0]
  • 仅在值为 nullish 时中断,不影响其他假值(如 0、false)

2.2 与传统 null 检查方式的对比分析

在早期编程实践中,null 检查通常依赖于显式的条件判断,代码冗余且易出错。例如,Java 中常见写法如下:

if (user != null) {
    Address address = user.getAddress();
    if (address != null) {
        String city = address.getCity();
        System.out.println(city);
    }
}
上述嵌套判断逻辑繁琐,可读性差。现代语言引入了安全调用操作符(如 Kotlin 的 `?.`)和 Optional 类型,显著提升了代码安全性与简洁性。
主流 null 处理机制对比
  • 传统方式:逐层判空,风险高,维护成本大;
  • Optional(Java):通过封装避免直接访问,强制处理可能的空值;
  • 安全调用(Kotlin/JavaScript):使用 `?.` 简化链式调用,自动短路空引用。
性能与可读性权衡
方式可读性性能开销推荐场景
手动判空低无遗留系统维护
Optional高中等新 Java 项目
安全调用操作符极高低Kotlin、TypeScript 等现代语言

2.3 空传播在引用类型与可空值类型中的应用差异

空传播操作符的基本行为
空传播操作符(?.)在处理引用类型和可空值类型时表现出不同的语义特性。对于引用类型,它用于避免对 null 实例调用成员导致的 NullReferenceException。
引用类型的空传播
string name = person?.Name;
若 person 为 null,表达式返回 null 而非抛出异常。这是引用类型安全访问的常见模式。
可空值类型的特殊性
可空值类型(如 int?)本身已支持 null 语义,空传播常用于链式调用:
int? age = customer?.Profile?.Age;
其中 Profile 为引用类型,Age 为 int?。整个表达式仅在所有前置对象非 null 时返回实际值,否则为 null。
  • 引用类型:空传播防止运行时异常
  • 可空值类型:增强数据链的安全提取

2.4 方法链中空传播的执行流程剖析

在方法链调用中,当某个中间对象为 null 或 undefined 时,传统调用会抛出运行时异常。空传播操作符(如 ?. 在 JavaScript 中)可安全跳过后续方法调用,直接返回 undefined。
执行流程分步解析
  1. 从左至右依次求值方法链中的每个成员
  2. 若当前成员为 nullish(null 或 undefined),则中断执行
  3. 返回 undefined,不再调用后续方法
  4. 否则继续执行下一个方法调用
代码示例与分析
const result = user?.getProfile()?.getEmail()?.toLowerCase();
上述代码中,若 user 为 null,则整个表达式短路返回 undefined,避免 TypeError。该机制显著提升链式调用的安全性与简洁性。
流程图示意
开始 → 调用 user?.getProfile() → [结果为 null?] → 是 → 返回 undefined
↓ 否
调用 getEmail()? → [结果为 null?] → 是 → 返回 undefined
↓ 否
执行 toLowerCase() → 结束

2.5 编译器如何处理空传播表达式:IL 层面解读

空传播表达式(Null-Conditional Operator)如 c?.Property 在 C# 中简化了 null 检查逻辑。编译器在生成 IL 时会将其展开为显式的条件判断。
IL 生成机制
编译器将 c?.Property 转换为类似三元运算的 IL 指令序列,先判断对象是否为 null,再决定是否访问成员。
Person p = person?.GetInfo();
上述代码会被编译为:
  • 加载 person 到计算栈
  • 使用 brfalse.s 指令跳转至 null 分支
  • 若非 null,则调用 GetInfo()
  • 最终统一返回值(可能为 null)
性能与语义保证
该机制确保短路求值,避免不必要的方法调用或属性访问,同时在 IL 层保持类型安全和执行效率。

第三章:三大典型应用场景深度解析

3.1 场景一:深层对象属性访问的安全简化

在处理复杂嵌套数据结构时,直接访问深层属性容易引发运行时错误,尤其是在某些中间节点为 null 或 undefined 的情况下。
传统方式的风险
常见的访问方式如 user.profile.settings.theme,一旦 profile 不存在,将抛出类型错误。开发者常通过多重条件判断规避:
const theme = user && user.profile && user.profile.settings && user.profile.settings.theme;
该写法冗长且可读性差,维护成本高。
现代解决方案
使用可选链操作符(?.)可大幅简化:
const theme = user?.profile?.settings?.theme;
此语法自动检测每层是否有效,若任一环节为 null 或 undefined,立即返回 undefined 而不中断程序。
  • 提升代码健壮性
  • 减少防御性编程的样板代码
  • 增强数据路径访问的可读性

3.2 场景二:事件委托调用中的线程安全优化

在高并发场景下,事件委托常面临多线程竞争问题。直接在事件处理器中修改共享状态可能导致数据不一致。为此,需引入线程安全机制保障调用的原子性与可见性。
锁机制与无锁优化策略
使用互斥锁可快速实现线程安全,但可能影响吞吐量。更优方案是采用原子操作或不可变数据结构减少锁粒度。
var mu sync.RWMutex
var eventHandlers = make(map[string]func())

func AddHandler(event string, handler func()) {
    mu.Lock()
    defer mu.Unlock()
    eventHandlers[event] = handler
}

func TriggerEvent(event string) {
    mu.RLock()
    handler := eventHandlers[event]
    mu.RUnlock()
    if handler != nil {
        handler()
    }
}
上述代码通过读写锁分离读写操作,在频繁触发事件的场景下降低锁争用。写操作(添加处理器)使用独占锁,读操作(触发事件)使用共享锁,提升并发性能。
性能对比
方案吞吐量安全性
无同步高低
互斥锁中高
读写锁高高

3.3 场景三:API 响应数据解析时的异常预防

在调用第三方 API 时,响应数据结构可能因网络问题、服务端错误或版本变更而不稳定。为避免解析失败导致程序崩溃,需建立健壮的异常预防机制。
防御性数据解析
使用类型检查与默认值回退策略,确保关键字段缺失时不中断执行流程:

function parseUserResponse(data) {
  if (!data || typeof data !== 'object') {
    console.warn('Invalid response format');
    return { id: null, name: 'Unknown', email: '' };
  }
  return {
    id: data.id || null,
    name: data.name?.trim() || 'Unknown',
    email: typeof data.email === 'string' ? data.email.toLowerCase() : ''
  };
}
上述函数对输入进行空值与类型校验,利用可选链(?.)防止访问嵌套属性时报错,并对字符串字段做标准化处理。
常见异常类型对照表
异常类型可能原因应对措施
JSON Parse Error返回非 JSON 文本try/catch 包裹 JSON.parse
字段 undefined接口字段变更设置默认值 + 运行时日志告警

第四章:常见陷阱与最佳实践指南

4.1 陷阱一:误用导致的逻辑错误与空异常遗漏

在开发过程中,对变量状态判断不充分极易引发运行时异常。尤其在处理外部输入或异步返回数据时,忽略空值校验将直接导致 NullPointerException 或类似错误。
常见误用场景
  • 未判空直接调用对象方法
  • 集合遍历前未验证是否为 null 或 isEmpty()
  • 条件分支遗漏边界情况处理
代码示例与修正

// 错误写法
if (userList.size() > 0) {
    for (User u : userList) { ... }
}

// 正确写法
if (userList != null && !userList.isEmpty()) {
    for (User u : userList) { ... }
}
上述错误写法在 userList 为 null 时会抛出空指针异常。正确做法应先判断引用非空,再检查业务逻辑条件,确保程序健壮性。

4.2 陷阱二:性能影响与过度链式调用的问题

在现代编程中,方法链式调用被广泛用于提升代码可读性,但过度使用可能导致严重的性能损耗。
链式调用的性能隐患
频繁的对象方法调用会增加函数调用栈深度,并可能引发不必要的中间对象创建。例如在 JavaScript 中:

users
  .filter(u => u.age > 18)
  .map(u => ({ ...u, level: 'adult' }))
  .sort((a, b) => a.name.localeCompare(b.name));
上述代码每次操作都会生成新数组,造成内存浪费。应考虑使用惰性求值库(如 Lodash 的链式优化)或重构为单遍循环。
优化策略对比
方式时间复杂度空间复杂度
传统链式O(n)O(n)
惰性求值O(n)O(1)

4.3 实践建议一:结合空合并操作符合理构建默认值

在现代 JavaScript 开发中,空合并操作符(??)为处理 null 和 undefined 提供了更精准的默认值赋值方式。
空合并操作符的基本用法
const userName = userInput ?? '匿名用户';
上述代码中,仅当 userInput 为 null 或 undefined 时,才会使用默认值。与逻辑或操作符(||)不同,它不会将 0、空字符串等“假值”替换。
多层默认配置的构建策略
  • 优先使用传入参数中的有效值
  • 逐级回退到预设安全默认值
  • 避免因误判“假值”导致配置丢失
结合复杂对象解构时,可实现灵活且健壮的配置初始化机制。

4.4 实践建议二:在 LINQ 与表达式树中的安全使用

在使用 LINQ 与表达式树时,需警惕运行时异常和查询翻译失败。尤其在 Entity Framework 等 ORM 框架中,表达式树将被翻译为 SQL,不支持的操作会导致查询执行失败。
避免不支持的方法调用
确保在表达式树中仅使用可翻译的方法,如 Where、Select 中调用的方法应为基本逻辑操作。

Expression<Func<User, bool>> expr = u => u.Name.Contains("admin") && u.Age > 18;
该表达式可被 EF Core 成功翻译为 SQL 条件语句,但若调用自定义方法(如 u.IsValid()),则会抛出异常。
推荐的安全实践
  • 优先使用 LINQ 标准查询操作符
  • 避免在表达式中嵌入复杂逻辑或外部函数
  • 利用编译时检查发现潜在翻译问题

第五章:总结与未来展望

技术演进的持续驱动
现代软件架构正加速向云原生和边缘计算融合,Kubernetes 已成为服务编排的事实标准。以下是一个典型的 Pod 水平伸缩配置示例:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: api-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: api-server
  minReplicas: 3
  maxReplicas: 20
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
行业落地中的挑战与对策
在金融与制造领域,系统稳定性要求极高。某银行核心交易系统迁移至微服务后,通过以下措施保障 SLA:
  • 实施全链路灰度发布策略,按用户标签分流流量
  • 引入 Service Mesh 实现细粒度熔断与限流
  • 构建基于 Prometheus + Alertmanager 的三级告警体系
  • 每月执行一次混沌工程演练,验证系统韧性
未来技术融合趋势
AI 与基础设施的深度集成正在重塑运维模式。下表展示了 AIOps 在典型场景中的应用对比:
场景传统方式AIOps 方案
异常检测固定阈值告警基于时序预测的动态基线
根因分析人工排查日志拓扑图谱 + 关联规则挖掘

智能调度流程图

监控数据采集 → 特征工程 → 异常识别模型 → 决策引擎 → 自动扩缩容/故障切换

TS中的神秘符号:?.、??、!. 实战解析与应用场景 本文深入解析了TypeScript中三个核心操作符`?.`、`??`和`!.`的实战应用。通过对比传统冗长的空值检查代码,展示了可选链操作符`?.`如何简化深层属性访问,空值合并运算符`??`如何智能设置默认值,以及非空断言`!.`的适用场景与注意事项,旨在帮助开发者编写更安全、简洁且易维护的TypeScript代码。 阅读详情

相关推荐

.NET开发者该学IL还是汇编?目标驱动的底层学习路径

中间语言(IL)和汇编是理解.NET运行时机制的两个关键抽象层:IL作为C#等高级语言到CLR的中间表示,具有跨平台、静态、结构化特性;而汇编则代表JIT编译器动态生成的真实机器码,直接反映CPU执行行为。二者本质不同——IL不可执行,汇编决定性能瓶颈。技术价值在于通过工具链(如dotnet-dump、Visual Studio反汇编窗口)建立‘从代码到机器’的可观测闭环,支撑性能调优、内存分析与疑难问题定位。典型应用场景包括高频交易延迟排查、泛型JIT行为验证、GC毛刺根因分析等。本文聚焦.NET工程师如

chuji3953的博客 390

ES6中js的运算符(?.、?:、? ?、? ?=、)

一、空值合并操作符( ?? ) 空值合并操作符( ?? )是一个逻辑操作符,当左侧的操作数为 null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数。 空值合并操作符( ?? )与逻辑或操作符( || )不同,逻辑或操作符会在左侧操作数为假值时返回右侧操作数。 const nullValue = null; const emptyText = ""; // 空字符串,是一个假值,Boolean("") === false const someNumber = 42; const

ShIcily的博客 2万+

程序员精神内核:六大工程心法驱动技术成长

在软件开发领域,技术栈迭代迅速,框架文档易查,但真正决定开发者长期竞争力的,是隐性工程能力——需求拆解定力、线上故障定力、跨团队协同张力与自我重启韧性。这些能力无法通过API调用获取,却可通过结构化修炼沉淀为可迁移的认知资产。本文基于.NET生态实践,提炼出‘遇强更强’‘逆水行舟’等六大可落地心法,融合真实项目中的重构演进、技术选型验证与跨语言抽象训练,将武侠式成长逻辑转化为每日可执行的开发仪式。尤其适用于C#开发者突破中级瓶颈、构建面向十年的技术纵深。

a6t2007的博客 400

JS 中 ?. 运算符和 ?? 运算符&&短路逻辑

JS 中 ?. 运算符和 ?? 运算符&&短路逻辑

weixin_39501680的博客 523

信息学奥赛一本通高手训练1680:序列

题目 代码 #include<cstdio> #include<iostream> #include<cmath> #define LL long long using namespace std; const LL N = 1400000+7; const LL mod = 1e9+7; int n, t; LL pos[N], sum[N], ans[N]; struct node{ LL ll, rr; }a[N]; int main(){ p

qingfeixueyue的博客 468

手机刷双系统

刷机教程(https://www.geekeyes.cn/forum.php/forum.php?mod=viewthread&amp;tid=492) 解锁教程(http://www.gioov.com/index.php/1386)   解锁教程 cmd下 进入adb目录( 如果环境变量配置了adb 可以直接在cmd 下输入命令) 手机连接电脑,确保usb 调试打开,然后手机连接电脑,...

超宇的博客 1万+

?.、!.、??、|| 和 &&区别

告诉 TypeScript 或 JavaScript,某个值一定不是。是常用的操作符,用于处理不同的逻辑场景。:判断左侧值是否为真值,如果是则返回右侧值,否则返回左侧值。:在 TypeScript 中明确告诉编译器某个值不为空。:访问深层嵌套对象时,避免因中间属性不存在而报错。:安全访问嵌套对象的属性或方法,避免因。),如果是则返回右侧值,否则返回左侧值。,如果是则返回右侧值,否则返回左侧值。:提供默认值,且可以接受假值被覆盖。:判断左侧值是否为假值(:提供默认值,且不希望。,避免类型检查报错。

weixin_50756332的博客 2746

Jenkins Job DSL:用代码管理CI/CD配置的实践指南

Jenkins 是持续集成(CI)领域的经典开源平台,其核心价值在于自动化构建与交付流程。然而传统 UI 配置方式导致配置不可版本化、难以复现、审计困难,严重制约团队规模化协作效率。Job DSL 作为一种声明式配置即代码(IaC)方案,通过 Groovy 脚本驱动 Jenkins 内部 API,实现 Job、View、Folder 等资源的程序化创建与维护,天然支持 Git 版本控制、权限审计与环境一致性保障。它不替代 Pipeline,而是与其协同构成‘流程定义’与‘基础设施定义’双轨体系,显著提升 C

weixin_33744141的博客 519

C#中的空值传播运算符优雅处理空引用的艺术

例如,在处理一个可能为`null`的对象`person`时,若要安全地获取其`Name`属性的长度,传统方式需要多层`if`判断。这条语句会依次检查`person`和`person.Name`是否为`null`,任何一环为`null`,整个表达式的结果就是`null`(在这里被可空类型`int?其核心原理是短路求值:当运算符左侧的操作数为`null`时,整个表达式的结果将立即返回`null`,而不会继续计算右侧的成员或元素访问,从而避免了潜在的`NullReferenceException`。

mingxuan13141314的博客 444

IEEE802.11bf: WLAN Sensing Standard

下表为IEEE802.11bf 定义的使用情境 (Use Cases)

qinsd19的博客 1056

Widar3.0复现日志(DFSExtractionCode)

需要使用的matlab基本功能

XiaoQiXiaoWei_J的博客 2437

Unity异步编程中UniTask任务取消的5个高级技巧与实战应用

在Unity游戏开发中,异步编程是处理资源加载、网络请求等耗时操作的核心技术。其原理基于任务调度与状态管理,通过取消机制实现资源的及时释放和逻辑的精确控制,这对于提升应用性能和稳定性具有重要价值。在实际开发场景中,开发者常面临内存泄漏和逻辑错误等挑战,特别是在快速切换场景或处理复杂状态时。本文聚焦于UniTask框架下的任务取消机制,深入探讨如何通过CancellationTokenSource与Unity生命周期绑定、利用链接令牌实现复合取消等高级技巧,有效预防资源泄漏并优化异步逻辑编排,为构建健壮的Un

weixin_33806300的博客 425

学Simulink——基于Simulink的固态变压器(SST)多级协同控制​

本文介绍了基于Simulink的固态变压器(SST)多级协同控制系统设计与仿真方法。SST作为智能电网关键设备,包含AC-DC整流、DC-DC隔离和DC-AC逆变三级变换器。针对级间耦合问题,提出了能量-功率协同控制策略,通过纵向解耦和横向联动实现稳定运行。详细演示了在Simulink中搭建三级主电路、设计协同控制器(含电网定向控制、功率前馈和虚拟惯性控制)的全过程,并通过负载突变测试验证了系统动态性能(直流母线电压波动<2%)。最后给出了工程部署建议,包括数字控制延时补偿、启动序列设计和代码自动生成

xiaoheshang_123的博客 206

JavaScript 中的 . 和 ?. 操作符的区别和优缺点

(点)操作符是 JavaScript 的基本操作符之一,简单易懂,速度快,但在处理嵌套对象时会变得冗长。可选链操作符(?.)是一个相对新的语法,可以帮助我们安全地访问对象的属性或方法,但运行时性能相对 . (点) 操作符略低,可能会返回 undefined。因此,我们可以根据不同的场景来选择使用哪种操作符。例如,假设我们有一个名为 person 的对象,它有一个名为 address 的属性,address 属性有一个名为 city 的子属性。在没有?

qq_53026081的博客 3079

ASProxy64.dll导致jetbrains家的IDE都无法打开。

摘要:在Windows11系统中,JetBrains IDE无法启动,报错指向ASProxy64.dll文件。该第三方DLL被注入到JVM原生层,导致内存访问冲突(错误代码0xc0000005)。经排查发现此文件来自Astrill软件。解决方案为卸载Astrill后重启电脑,问题得以解决。该案例表明第三方DLL注入可能影响IDE正常运行,卸载相关软件是最直接的解决方法。(149字)

猿小白的博客 936

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

JavaScript中 ?. !. ?? 的用法及区别

【代码】JavaScript中??的用法及区别。

gxdzi的博客 4573

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

?? 运算符、?. 运算符和 ?. .运算符

运算符的进一步简形式是?如果对象的某个属性或方法不存在,. 运算符会抛出一个TypeError,而?在这个例子中,虽然obj.foo存在,但它的值为null,所以使用. 运算符对bar进行访问抛出TypeError,而使用?在这个例子中,如果getInputValue(‘username’)返回的值为null或undefined,则username会被设置为加菲猫作为默认值。在这个例子中,由于x的值为0,它被判定为 “falsy” 值,所以使用 || 运算符时返回了y的值,而使用?

weixin_53954018的博客 2411

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

简化 null 检查:C# 中的 ?. 和 ?? 运算符

C# 中的?. 和??运算符极大地简化了 null 值的处理,减少了冗长的空值检查代码。?. 运算符让你能够安全地访问可能为 null 的对象成员,而??运算符则为 null 值提供了一个默认值。两者结合使用,可以让你写出更加简洁、易读、且不容易出错的代码。如果你还不熟悉这些运算符,建议尽快在你的代码中应用它们,提升代码的质量和可维护性。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1835

运算符 ?. 、?? 、 ! 的介绍和用法

运算符是JavaScript与TypeScript中都可以使用,!TypeScript中常用的操作符,表示表达式一定不是null或者undefined,可直接调用无须额外验证。逻辑运算符,当左侧的表达式为null或undefined时,它会返回其右侧的表达式。允许我们读取位于连接对象链深处的属性的值,而不必显式地验证链中的每个引用是否有效。在运算中合理使用这几种运算符,可以更简洁方便的编写代码,也更容易理解。与||运算符区别:||当左边为false时,就会取右侧的表达式。

FaxMiao的博客 6563

Javascript 中 ?. 运算符和 ?? 运算符

一、链判断运算符(?. 运算符) 实际开发中,如果要读取对象内部的某个属性,往往需要先判断一下该对象是否存在。 比如,要读取user.firstName,安全的写法应该是下面这样的: const firstName = (user && user.firstName) || 'default' 这样的层层判断非常麻烦,因此ES2020引入了“链判断运算符”(optional chaining operator)?. 来简化上面的写法 const firstName = ...

Wayne8016的博客 1万+

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

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

qq_53114797的博客 1万+

js中?.、??、??=的用法及使用场景

上面这个错误,相信前端开发工程师应该经常遇到吧,要么是自己考虑不全造成的,要么是后端开发人员丢失数据或者传输错误数据类型造成的。因此对数据访问时的非空判断就变成了一件很繁琐且重要的事情,下面就介绍ES6一些新的语法来方便我们开发。

Perback的博客 1478

vue项目中的?和??的作用

可选链运算符 (?.) 允许我们读取位于连接对象链深处的属性的值,而不必显式地验证链中的每个引用是否有效。如果链中的某个引用是 null 或 undefined,表达式会短路并返回undefined。在第二个例子中,当 user 被设置为 null 时,直接访问 user.profile.name 通常会导致运行时错误。但是,通过使用?. 运算符,我们可以安全地访问属性,并在链中的任何环节为 null 或 undefined 时得到 undefined 而不是错误。相当于&&a?

m0_70935375的博客 1389

JS 新操作符 —— “?.”、“??”、“??=”

【代码】JS 新操作符 —— “?.”、“??”、“??=”

吴钦飞 5136

typeScript 运算符: ?? 、?: 、?. 、 !. 、&&、||、!! 的用法

使用可选链操作符可以避免在访问一个不存在的属性或方法时出现运行时错误或异常。用法类似,从左至右判断,遇到直值(true)则停下,但使用?0和false也为真值(true)常规写法和可选链写法对比。

qq_46544466的博客 5711
上一篇: Unity中DontDestroyOnLoad的10大坑,90%的开发者第3个就中招(单例管理避雷手册)
下一篇: 【PHP 枚举权威指南】:掌握 BackedEnum 自动类型转换的 5 个核心场景
DevPath
博客等级 码龄1年 179粉丝 2176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值