当前位置: 首页 > news >正文

TypeScript中?和!号用法

在ECMAScript中,?和!号有多种使用场景:

1、?号的使用场景

1.1、三元运算

三元运算是最常见的?号一种用法:表达式1?表达式2:表达式3

let age = 20;
let status = (age >= 18) ? "成年人" : "未成年人";
console.log(status); // 输出:成年人

1.2、可选属性 / 可选参数

在ECMAScript2020版本中引入在对象类型定义(尤其是 TypeScript 中)和函数参数中,? 表示该属性或参数是可选的。
在对象类型中:

interface Person {name: string;age?: number; // 可选属性
}

在函数参数中:

function info(name: string, age:number , sex?: string) {console.log(`${name}, ${age} , ${sex || '保密'}`);
}

注意:这种用法属于 TypeScript 或 ES2020+ 的扩展,并非原生 JavaScript 运行时行为。

1.3、可选链操作符

用于安全地访问嵌套对象的属性,避免因为某个中间属性为 null 或 undefined 而导致错误。

user?.name
user?.[sex]
user?.[address]
func?.(args)
let user = {name: '张无忌',address: '光明顶',fn: () => { console.log('fn') },company: {name: '武当派',address: '武当山',},
};console.log(user.name); // 张无忌
console.log(user['address']); // 光明顶
console.log(user.fn?.()); // fn
console.log(user.company?.name); // 武当派
console.log(user.company?.address); // 武当山
console.log(user.company?.work); // 不会报错,输出 undefined

2、!号的使用场景

2.1、逻辑非运算符

这是最常见的!号用法:将一个值转换为布尔类型并取反。

console.log(!true);   // false
console.log(!false);  // true
console.log(!"hello"); // false(字符串为真值)
console.log(!"");     // true(空字符串为假值)

2.2、 非空断言操作符

告诉类型检查器某个值不可能是 null 或 undefined,【TypeScript 特有】

let element!: HTMLElement;
element!.style.color = "red"; // 告诉编译器这里一定不是 null/undefined

注意:这是 TypeScript 的特性,JavaScript 本身不支持。

2.3、立即调用函数表达式(IIFE)前的

!function() {console.log("IIFE");
}();

这里的 ! 是为了让函数表达式被立即执行。它不是必须的,但可以避免语法错误,也可以使用 void、+ 等其他一元运算符达到类似效果。

3、总结

符号用法含义所属标准
?cond ? a : b三元运算JS标准
?ojb?.prop可选链操作符ES2020标准
?param?: type可选参数 (TS)TypeScript标准
!!value逻辑非JS 标准
!value!非空断言 (TS)TypeScript标准
!!function(){}IIFE包裹JS技巧
http://www.xdnf.cn/news/713539.html

相关文章:

  • Asp.Net Core 托管服务
  • Cannot find any provider supporting AES/ECB/PKCS7Padding
  • 智能外呼系统中 NLP 意图理解的工作原理与技术实现
  • 【前端】Vue3 中实现两个组件的动态切换保活
  • 制造企业生产数据分析全解析:5大类数据定义、分析方法与落地指南
  • 【Oracle】DCL语言
  • 【深度学习新浪潮】什么是混合精度分解?
  • Docker常用命令操作指南(一)
  • OPC Client第6讲(wxwidgets):Logger.h日志记录文件(单例模式);登录后的主界面
  • 【HTML/CSS面经】
  • 各国竞争的下一代液晶技术:中国铁电液晶取得重大突破突破
  • python和风api获取天气(JSON Web Token)
  • PostgreSQL如何更新和删除表数据
  • 【达梦数据库】内存使用资源评估
  • 图片压缩工具 | 发布到咸鱼并配置网盘自动发货
  • 通义灵码2.5——基于MCP实现我的12306火车票智能查询小助手
  • 66常用控件_QTableWidget的使用
  • 如何在 Odoo 18 中创建 PDF 报告
  • 【JavaScript 高级】事件循环机制详解
  • 第一个桌面应用程序的创建
  • 实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.2 R语言解题
  • 文科小白学习Linux系统之安全管理
  • QT使用说明
  • matlab天线阵列及GUI框架,可用于相控阵,圆形阵,矩形阵
  • 【C/C++】线程安全初始化:std::call_once详解
  • 数据中心双活架构解决方案
  • 基于大模型的颈椎病全周期预测与治疗方案研究报告
  • 软件开发新技术课设-个人博客系统(一)
  • 【HarmonyOS 5】鸿蒙应用px,vp,fp概念详解
  • VSCode + GD32F407 构建烧录