?. !!. ?.let和?: 的区别

TS中的神秘符号:?.、??、!. 实战解析与应用场景 本文深入解析TypeScript中的神秘符号`?.`、`??`和`!.`的实战应用与场景。通过具体代码示例,详细讲解可选链操作符`?.`的安全导航、非空断言`!.`的谨慎使用以及空值合并运算符`??`的精准默认值处理,帮助开发者提升类型安全与代码简洁性。 阅读详情
一、? 与 !! 的比较
val a: String = "aa"
    /*
    * a是非空类型,下面的给a赋值为null将会编译不通过
    * */
    // a = null
    a.length

    /*
    * ?声明是可空类型,可以赋值为null
    * */
    var b: String? = "bb"
    b = null
    
    /*
    * b是可空类型,直接访问可空类型将编译不通过,需要通过?.或者!!.来访问
    * */
    // b.length
    b?.length
    b!!.length
  • 对于一个不可为空类型:如果直接给不可为空类型赋值一个可能为空的对象就在编译阶段就不能通过
  • 对于一个可空类型:通过?声明,在访问该类型的时候直接访问不能编译通过,需要通过?.或者!!.
    • ?. 代表着如果该类型为空的话就返回null不做后续的操作,如果不为空的话才会去访问对应的方法或者属性
    • !!. 代表着如果该类型为空的话就抛出NullPointerException,如果不为空就去访问对应的方法或者属性, 所以只有在很少的特定场景才用这种符号,代表着程序不处理这种异常的case了,会像java代码一样抛出NullPointerException。 而且代码中一定不用出现下面这种代码,会让代码可读性很差而且如果有空指针异常,我们也不能马上发现是哪空了:
    /*
    * 不推荐这样的写法:链式的连续用!!.
    * */
    val user = User()
    user!!.name!!.subSequence(0,5)!!.length

二、let语句简化对可空对象对访问

  • let函数默认当前这个对象作为闭包的it参数,返回值是函数里面最后一行,或者指定return。
 * 通过let语句,在?.let之后,如果为空不会有任何操作,只有在非空的时候才会执行let之后的操作
    * */
    user?.let {
        it.name
        it.age
        it.toString()
    }


三、?: 简化对空值的处理

?:符号会在符号左边为空的情况才会进行下面的处理,不为空则不会有任何操作。跟?.let正好相反,例如我们可以用两行代码来简化上面从操作:

/**
 * Elvis操作符 ?: 简化对空值的处理
 */
fun testElvis2(input: String?, user: User?) {
    val b = input?.length ?: -1;
    user?.save() ?: User().save()
}





TS中的?.、??、!.符号:新手最容易混淆的3个操作符详解(附Vue3实战案例) 本文详细解析了TypeScript中新手最容易混淆的三个操作符:可选链`?.`、空值合并`??`和非空断言`!.`。通过对比其核心区别、使用场景,并结合Vue 3实战案例,帮助开发者安全、优雅地处理空值问题,避免常见陷阱,提升代码的健壮性和可读性。 阅读详情

相关推荐

JavaScript:var、let和const的区别

JavaScript变量声明方式对比摘要: JavaScript中有多种变量声明方式,主要分为传统方式(var)和ES6新增方式(let/const)。var具有函数作用域和变量提升特性,允许重复声明;let和const具有块级作用域和暂时性死区特性,let允许重新赋值而const不允许。此外还有全局变量声明(不推荐)、函数参数声明、function/class声明、import/export声明等多种方式。最佳实践建议优先使用const,需要重新赋值时用let,避免使用var和无关键字声明。不同声明方式在

搬砖人的博客 990

Kotlin ?.let 、!! 、?:等运算符的使用

作者:燕歆波 导读:使用Kotlin开发,人性化提示 ?.let等语法处理 1、?.let a?.let{it} 的意思: 当a为null时,什么都不执行 当a不为null时,执行大括号里的语句,意味着it肯定不为null 上面的语法可以理解为: if(a == null){ println("什么都不执行") } else{ println("执行") } 2、!! 在使用这句代码的时候如果不在outFilePath后加上!!,kotlin会在使用mSrcFilePath的地方提示风险,会.

yanxiaosa的博客 3582

var 和 let的区别_let 和 var的区别

js定义变量前言1.js 定义变量 使用 var 或者let2.js定义常量 使用 const3.var 定义变量是用js语言诞生就有的; let定义变量是从ES6新语法开始的。4.let定义变量,符合常规强类型语言定义变量逻辑,新定义再使用+不能重复生命。var 和 let的区别_let 和 var的区别整理如下:一、作用域级别不同var是函数级作用域let只能是块级作用域,跟C#等强类型变量作用域一样。在函数中声明了var,整个函数内都是有效的,比如说在for循环内定义的一个var变量,实际上其在for

天马3798 2889

Kotlin要点之一 | let

1a. 功能定义 public inline fun <T, R> T.let(block: (T) -> R): R = block(this) public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block() public inline fun ...

jxq1994的博客 5234

Codesys电子凸轮功能块MC_CamIn的masteroffset和slaveoffset参数的使用

问题1:在Codesys使用作轴电子凸轮时,MC_CamTableSelect的参数设置为MasterAbsolute=1,SlaveAbsolute=1,此设置为绝得模式, 此时主从轴当前位置都不为零时,此时Masteroffset=0、slaveOffset=0,凸轮启时出现突变,实轴无法启动。问题分析:在觉得模式下,主轴位置和从轴为是对应凸轮表的相位的,Masteroffset=0、slaveOffset=0,启动点时在主轴位置=0,从轴位置=0的点启动,此时主轴当前位置不为零则主从轴位置发生突变,

weixin_43587371的博客 1801

PyQt5 + HFSS:给你的仿真脚本做个专属GUI界面(零基础搭建指南)

本文详细介绍了如何使用PyQt5为HFSS仿真脚本创建专属GUI界面,适合零基础用户快速上手。通过Python二次开发,实现参数可视化调整、进度实时监控等功能,大幅提升团队协作效率。文章涵盖环境配置、界面设计、HFSS集成到打包部署的全流程,是仿真工程师提升工作效率的实用指南。

weixin_42535720的博客 185

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

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

weixin_50756332的博客 2745

基因的富集分析

通过RNA_seq差异表达分析等获得一组基因,想要进一步了解这些基因可能参与哪些生物学过程,具有哪些功能,一般就会用到基因的富集分析了。现在小麦基因注释信息已经可以获得,目前来看包括两套。一个是TGACv1,另一个就是IWGSC1.0。需要用到一个叫“clusterProfiler”的R包。下面用到的数据集来自TGACv1。1、安装source("https://bioconductor.org/b

xxxxx 1万+

var、let、const的区别以及暂时性死区(重点:let和const是有变量提升的!!)

但是呢,其实真正意义上说,let和const是有变量提升的!我们先来看一下MDN上是怎么说的其实let和const有变量提升的,只是因为产生了。

用于分享前端相关的知识和架构体系 432

AD学习笔记(一)基础认识

文章目录AD学习笔记第一讲 AD基础认识一、两库两图(分别对应下图)1、PCB图(pcbdoc)2、原理图(schdoc)3、原理图库(schlib)4、PCB库(pcblib)二、封装1、DIP封装2、LQFP封装三、绘制整体流程1、建立工程(PrjPcb)2、建立两库两图并保存整个工程(五次)3、从库中提取绘制原理图4、原理图导入pcb图5、根据原理图布线6、pcb图交由工厂打板 AD学习笔记 第一讲 AD基础认识 一、两库两图(分别对应下图) PCB图(pcbdoc) 原理图(schdoc) PCB库

qq_52465473的博客 6686

SAP BSP网页开发入门:从SE80创建到MVC实战(附成品展示)

本文详细介绍了SAP BSP网页开发的入门与实战,从SE80环境搭建到MVC架构实现的全流程。通过具体案例和代码示例,帮助开发者掌握业务服务器页面(BSP)技术,提升SAP Web化转型中的开发效率,适用于需要扩展SAP功能的企业场景。

x1y2z的博客 1万+

let和const的区别

let和const很相似 1、let和const的相同点: ① 只在声明所在的块级作用域内有效。 ② 不提升,同时存在暂时性死区,只能在声明的位置后面使用。 ③ 不可重复声明。 2、let和const的不同点: ① let声明的变量可以改变,值和类型都可以改变;const声明的常量不可以改变,这意味着,const一旦声明,就必须立即初始化,不能以后再赋值。 打个比方说: let x = 3; x = 4; 这样子是可以的,因为let声明的变量是可以修改或者重新定义的。 再比如: const x = 4; x

Ninlo的博客 2万+

T-Box功能详解及应用

T - BOX,其全称为 Telematics Box,作为远程 / 车载通信模块,是一款集车身网络与无线通讯功能于一体的智能终端设备。它充当了多媒体车机与 TSP(汽车远程服务提供商)以及互联网之间的无线路由器角色,为用户创造了远程访问的可能。用户借助T - BOX能够对车辆配备的各个 ECU(电子控制单元)进行远程操控,包括远程启动或停止发动机开启或关闭空调天窗后备箱门车门,以及实现闪灯鸣笛等功能。

wgl110110的博客 5640

let 和 var 的区别

es6新增的let命令,用法类似于var,用来声明变量,区别如下: 1.var是全局作用域,let 只在当前代码块内有效 当在代码块外访问let声明的变量时会报错 { let a = 8; // a变量只在花括号内有效 var b = 9; } console.log(a); //ReferenceError: a is not defined console.log(b); //9 2.var有变量提升,let没有变量提升 3.let变量不能重复声明 参考

未末的博客 1万+

在Simulink中实现一个基于SiC MOSFET的高效率电机驱动系统

本文介绍了在Simulink中构建基于SiC MOSFET的高效率电机驱动系统的详细流程。系统由直流电源模块、SiC MOSFET逆变器模块、PMSM电机模型、控制策略模块(包括矢量控制和PWM生成)以及反馈测量模块组成。文章逐步指导了从模型创建到参数设置的完整过程,包括各模块的具体实现方法。通过仿真可以评估系统在不同负载条件下的响应速度、效率、功率密度等性能指标。该建模方法为电机驱动系统的设计和优化提供了有效工具,同时建议根据实际硬件规格和工程需求进行参数调整和定制化开发。

xiaoheshang_123的博客 248

基于matlab的CNN验证码识别系统(UI界面版)

基于matlab的CNN验证码识别系统(UI界面版),CNN验证码识别系统包括数据集处理、模型搭建、模型训练、界面设计与实现

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 481

javascript中let和var的区别

今天使用laravel-admin中的JS来控制页面的操作 部分内容转载于简书:javascript中let和var的区别 一、背景 $script = <<<JS const iIndexs = "{$iIndexs}"; $('#indexs').on('input', _debounce(ajaxVerifyI...

snow_love_xia的博客 3544

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

JS中var和let有什么区别?(详解)

相信很多人和我一样,使用js也有一段时间了,但是依然将不明白在js中 var声明的变量和let 声明的变量到底有什么区别。本文就给各位介绍清楚。

sleep_i_like的博客 2568

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

var、let、const的用法和区别

这里要提一下,var自己这个变量不管是在任何作用域当中都是可以重置或修改值,这就是为什么ES6中要加入let和const的使用了,防止在某个域中修改了与var变量名相同的值。const是定义一个常量,let和const都是只能在块级作用域中使用,都不能在相同作用域或者块级作用域中和其他变量或者函数拥有相同的名称。在for语句中定义的var会影响输出外的var定义的变量值;而for循环语句中的let不会影响输出外的var定义的变量值。在函数内声明的变量作用域是局部的(函数内)指的是可以先赋值后定义变量。

人生苦短 1121

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JS中let和var的区别

var是函数作用域,声明的变量在函数内的任何地方都可访问,即使在声明之前。let是块级作用域,声明的变量仅在其所在的代码块内有效,外部无法访问。var声明的变量会被提升到顶部,并且初始化为undefined。let声明的变量会被提升,但在声明之前是不能访问的。var允许在同一作用域内多次声明同一个变量。let不允许在同一作用域内重复声明同一个变量。var在全局作用域下会成为全局对象的属性。let在全局作用域下不会成为全局对象的属性。let。

m0_62599305的博客 1514

JS中 let 和var的区别

JS中let和var 的区别简单介绍letvar的常见变量提升ES6可以用let定义块级作用域变量let配合for循环的独特应用let没有变量提升与暂时性死区let变量不能重复声明 简单介绍let let是ES6中新增命令,用来声明局部的变量。用法类似var,但是所声明的变量,只会在let命令所在的代码块内有效,而且有暂时性死区的约束。 var的常见变量提升 var a = 99; ...

H_c_l的博客 2755

let、const和var的区别是什么?

let、const和var的区别是什么?

weixin_49114503的博客 1543

let和var的区别

let与var的区别

qq_43145310的博客 3683

Qlikview里的Set 和 Let 的区别

Qlikview里的变量声明有两种方法,一个是let,  一个是Set,本人一直有点混淆,不知道何时使用LET,何时使用SET,而且取值的时候,有多种写法,为了搞清楚,我做了个小的演示。我们都知道在qlikview的dashboard页面中可以使用dollar sign $(参数)或者直接写=参数的方式引用set or  let 声明的参数变量。下面看下两者使用的差别。 Vers

Watson的专栏 3101
上一篇: kotlin 与 java 对比
下一篇: kotlin list、set、map 的区别
三石磊168
博客等级 码龄12年 8粉丝 16原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值