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

JavaScript:问号?的多种用法

文章目录

  • 条件运算符 (三元运算符)
  • 可选链操作符 (?.)
  • 空值合并操作符 (??)
  • 逻辑赋值运算符(??= )
    • 补充:(&&=、||=)
  • 正则表达式中

条件运算符 (三元运算符)

早在ES1(ECMAScript 1st Edition)中就已经存在

let value = a > b ? exprIfTrue : exprIfFalse;
//为真,则返回 exprIfTrue 的值;否则返回 exprIfFalse 的值

可选链操作符 (?.)

ES2020(ECMAScript 2020)

obj?.propName;
//当尝试访问嵌套对象的属性时,如果 obj 是 null 或 undefined,则表达式将立即返回 undefined
//而不会抛出错误。这个操作符用于安全地访问可能不存在的对象属性或方法。

空值合并操作符 (??)

ES2020(ECMAScript 2020)

value ?? defaultValue;
//如果 value 不是 null 或 undefined,则返回 value;否则返回 defaultValue。
//该操作符用于提供一个默认值,当变量可能为空值时。

逻辑赋值运算符(??= )

ES2021(ECMAScript 2021)

??=(空值合并赋值) 这个运算符仅当左侧表达式的值为 null 或 undefined 时才执行右侧的赋值操作

let preference = localStorage.getItem('language');
preference ??= 'en'; // 如果从localStorage获取的语言偏好存在且非null/undefined,则使用该偏好;
// 否则将默认语言设置为'en'。let value;
value ??= "fallbackValue"; // 因为 value 为 undefined,所以将 "fallbackValue" 赋给 value;现在 value = "fallbackValue"let anotherValue = null;
anotherValue ??= "defaultValue"; // 因为 anotherValue 为 null,所以将 "defaultValue" 赋给 anotherValue;现在 anotherValue = "defaultValue"

补充:(&&=、||=)

&&=(逻辑与赋值) 这个运算符仅当左侧表达式的布尔值为真时才执行右侧的赋值操作。

let count = 0;
count &&= someCondition ? valueIfTrue : 0;
// 如果 someCondition 为真并且有值,则将 valueIfTrue 赋给 count;
// 否则 count 的值不变。let x = null;
x &&= 5; // 因为 x 为 false,所以不执行赋值,x 保持原值 nulllet y = {value: 1};
y.value &&= 3; // 因为 y.value 为 true(即非 null 和 undefined),所以 y.value 被赋值为 3,现在 y = {value: 3}

||=(逻辑或赋值) 这个运算符仅当左侧表达式的布尔值为假时才执行右侧的赋值操作。

let userSetting = localStorage.getItem('theme') || 'default';
userSetting ||= 'dark';// 如果从localStorage获取到的主题存在且非空字符串,则使用该主题;
// 否则将默认主题设置为'dark'。let color = "";
color ||= "blue"; // 因为 color 为空字符串(falsy),所以将 "blue" 赋给 color;现在 color = "blue"let enabled = false;
enabled ||= true; // 因为 enabled 为 false,所以将 true 赋给 enabled;现在 enabled = true

正则表达式中

1、量词:匹配零次或一次 在正则表达式模式中,? 可以放在一个字符、字符集或元字符后面,表示前面的元素可以出现0次或者1次。

let regex = /a?b/;
let str = "ab";
console.log(str.match(regex)); // 输出:["ab"]str = "b";
console.log(str.match(regex)); // 输出:["b"]

2、非贪婪量词:当 ? 与量词 {n, m} 或 {n,} 结合使用时,它变为非贪婪版本,尽可能少地匹配字符。

et regex = /.*?abc/g;
let str = "Hello abc world abc!";
console.log(str.match(regex)); // 输出:["abc", "abc"]

(.) 表示任何字符,(*?) 表示匹配任意数量的字符但尽可能少匹配,所以每次只匹配到第一个 “abc” 前的最短字符串。

3、非捕获组:当 ? 放在括号 () 开头时,形成 (?:pattern)? 形式的非捕获组,这个组不计入返回结果中,并且不会被捕获供后续引用。

let regex = /(?:ab)?c/;
let str = "ac";
console.log(str.match(regex)); // 输出:["c"]

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • HTML知识点
  • PaddleSeg分割框架解读[01] 核心设计解析
  • 手撕qsort函数
  • 数据库管理-第152期 Oracle Vector DB AI-04(20240220)
  • 闭包的定义与作用(含举例)
  • 在UE5中使用OverlayMaterial制作多材质效果
  • Redis Sentinel工作原理
  • 基于python+django+vue.js开发的医院门诊管理系统/医疗管理系统
  • 计算机网络Day1--计算机网络体系
  • 【计算机考研】408系统学习法
  • vue 生成word表格文档 前端库介绍
  • K8s ingress-nginx根据请求目录不同将请求转发到不同应用
  • Nginx笔记
  • 75.SpringMVC的拦截器和过滤器有什么区别?执行顺序?
  • MCAL知识点(二十七):TC275如何通过GPT12实现ABZ解码
  • [译] React v16.8: 含有Hooks的版本
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • Android Volley源码解析
  • CentOS7简单部署NFS
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • css的样式优先级
  • js学习笔记
  • js正则,这点儿就够用了
  • Octave 入门
  • Phpstorm怎样批量删除空行?
  • php面试题 汇集2
  • PHP那些事儿
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 初识 beanstalkd
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 使用 QuickBI 搭建酷炫可视化分析
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 新书推荐|Windows黑客编程技术详解
  • AI算硅基生命吗,为什么?
  • 带你开发类似Pokemon Go的AR游戏
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​linux启动进程的方式
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • #微信小程序:微信小程序常见的配置传旨
  • (+4)2.2UML建模图
  • (1)(1.9) MSP (version 4.2)
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (回溯) LeetCode 78. 子集
  • (接口封装)
  • (七)glDrawArry绘制
  • (十八)Flink CEP 详解
  • (一)Dubbo快速入门、介绍、使用
  • (一)UDP基本编程步骤
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .Net Core和.Net Standard直观理解