TypeScript中变量调用时后缀感叹号和问号的区别
typescript编译时,当我们开启严格模式时,下面的代码就会报错:
function doSomething(x: string | null) {
    console.log("Hello, " + x.toUpperCase());
}
编译错误:
hello.ts:56:29 - error TS2531: Object is possibly 'null'.
56     console.log("Hello, " + x.toUpperCase());
                               ~
当我们在调用变量x的方法时,增加后缀!和?时,这个编译错误都会消失:
x!.toUpperCase()   x?.toUpperCase()
那这两者到底有什么区别呢?
那我们运行分别运行下代码就可以看出端倪:
- 后缀是? - function doSomething(x: string | null) {
 console.log("Hello, " + x?.toUpperCase());
 } doSomething(null);
 
 输出是:
Hello, undefined
- 后缀是! - function doSomething(x: string | null) {
 console.log("Hello, " + x!.toUpperCase());
 } doSomething(null);
 - 输出是: - Uncaught TypeError TypeError: Cannot read properties of null (reading 'toUpperCase')
结论:
- 后缀是!,只是告诉typescript编译器对于null和undefined不做显示的检查,生成的js文件中还是x.toUpperCase(),如果此时x为null,那么就会出现运行时异常
- 后缀是?,代表是一个空判断,只有非空是,才会执行x.toUpperCase(),生成的js文件中是增加了null或者undefined判断的,生成的js是(x === null || x === void 0 ? void 0 : x.toUpperCase())
TypeScript中变量调用时后缀感叹号和问号的区别的更多相关文章
- JavaScript中变量声明有var和没var的区别
		JavaScript中变量声明有var和没var的区别 JavaScript中有var和没var的区别 Js中的变量声明的作用域是以函数为单位,所以我们经常见到避免全局变量污染的方法是 (functi ... 
- js中变量声明有var和没有var的区别
		转js中var用与不用的区别 2015年07月13日 16:08:22 阅读数:3627 Javascript声明变量的时候,虽然用var关键字声明和不用关键字声明,很多时候运行并没有问题,但是这两种 ... 
- 使用框架时,在web.xml中配置servlet时,拦截请求/和/*的区别。
		关于servlet的拦截设置,之前看了好多,说的都不太清除,明白. 最近明白了一些,总的来说就是保证拦截所有用户请求的同时,放行静态资源. 现整理如下: 一.我们都知道在基于Spring的Applic ... 
- 在php中定义常量时,const和define的区别?
		使用const使得代码简单易读,const本身就是一个语言结构,而define是一个函数.另外const在编译时要比define快很多. 1.const用于类成员变量的定义,一经定义,不可修改.Def ... 
- TypeScript 中函数的理解?与 JavaScript 函数的区别?
		一.是什么 函数是JavaScript 应用程序的基础,帮助我们实现抽象层.模拟类.信息隐藏和模块 在TypeScript 里,虽然已经支持类.命名空间和模块,但函数仍然是主要定义行为的方式,Type ... 
- [js]js中变量带var和不带var的区别
		上图已说的很清晰了. 下面代码是赘述 <script> //带var和不带var的区别: // 1.只有带var的才可以预解释,所以在赋值的前操作不会报错. console.log(num ... 
- C#中引用类型的变量做为参数在方法调用时加不加 ref 关键字的不同之处
		 一直以为对于引用类型做为参数在方法调用时加不加 ref 关键字是没有区别的.但是今天一调试踪了一下变量内存情况才发现大有不同. 直接上代码,结论是:以下代码是使用了 ref 关键字的版本.它输出1 ... 
- Don’t Use Accessor Methods in Initializer Methods and dealloc 【初始化和dealloc方法中不要调用属性的存取方法,而要直接调用 _实例变量】
		1.问题: 在dealloc方法中使用[self.xxx release]和[xxx release]的区别? 用Xcode的Analyze分析我的Project,会列出一堆如下的提示:Inco ... 
- python中使用list作为默认参数且调用时不给其赋值的问题
		最近在写代码时发现一个有趣的地方,当python中的函数使用list作为默认参数且调用时不给其赋值时,无法通过在函数中将其赋值为[]来达到清空此默认参数的目的.按照道理来说,函数f1中的list为局部 ... 
随机推荐
- CPU长指令(VLIW)失败的主要原因是什么,VLIW真的无药可救吗?
			software和hardware之间总是存在tradeoff:要么是hardware结构复杂,software灵活.要么是hardware结构保持简洁清晰,software干一些脏活累活.VLIW就 ... 
- 【洛谷】P1447 能量采集
			此题虽为紫,但其实在水 能量采集 题目描述 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一 ... 
- css蒙层
			{ -webkit-filter: grayscale(100%); -moz-filter: grayscale(100%); -ms-filter: grayscale(100%); ... 
- js数组用法
			去面试的时候问到我一个问题,你能说出来多少种数组的方法跟用法,我当时只说出来十一个,回来以后才想起来还有很多种,现在整理一下,没有排名,想起那个写那个 1:forEach 从头遍历数组,没有返回值,有 ... 
- SETTLE约束算法的批量化处理
			技术背景 在上一篇文章中,我们介绍了在分子动力学模拟中SETTLE约束算法的实现与应用,其中更多的是针对于单个的水分子.但由于相关代码是通过jax这一框架来实现的,因此对于多分子的体系,可以采用jax ... 
- SQL从零到迅速精通【实用函数(3)】
			1.LOWER()函数 使用LOWER函数将字符串中所有字幕字符转换为小写,输入语句如下. SELECT LOWER('BEAUTIFUL'),LOWER('Well'); 2.UPPER()函数 S ... 
- MacBook苹果电脑绕过BootCamp安装Win7双系统
			上周老婆的一个朋友的笔记本电脑说电脑太慢说帮忙清理一下电脑,我一看是MACBOOKPRO 的笔记装的双系统,之前一直接触的都是WINDOWS居多.想着干脆装个WIN10吧,谁知道一下就跳坑里了,一分区 ... 
- 采用 DIV+CSS 布局网页练习
			实验四:采用 DIV+CSS 布局网页练习 实验目的: 熟悉 DIV+CSS 布局网页的方法 实验要求: 1.制作一个完整网页和一个 css 文件: 2.在网页中采用 DIV+CSS 布局 4 个以上 ... 
- Git 常见错误 之 error:error: src refspec main does not match any/ error: failed to push some refs to 简单解决
			错误产生的原因:Github 工程默认名为了 main 由于受到"Black Lives Matter"运动的影响,GitHub 从今年 10 月 1 日起,在该平台上创建的所有新 ... 
- Java案例——ArrayList存储学生对象并遍历
			package ArrayListDemo;import java.util.ArrayList;import java.util.Scanner;/*案例:存储学生对象并遍历 需求:创建一个存储学生 ... 
