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"]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/694741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

word软件中硬件图像加速有什么用处?禁用硬件图形加速(G)会影响word文档中插入图片的分辨率吗?

问题描述:word软件中硬件图像加速有什么用处?禁用硬件图形加速(G)会影响word文档中插入图片的分辨率吗? 问题解答: 在 Microsoft Word 中,硬件图形加速主要用于提高图形元素的渲染速度和性能,特别是处理大…

FPS游戏之账号登录流程

在游戏开发中,账号登录的接入流程主要包含以下几个步骤: 创建账号系统:首先需要创建一个账号系统,能够让用户注册账号、登录账号以及找回和修改密码等。这个账号系统可以是自己开发的,也可以是接入的第三方服务如Goog…

如何添加或编辑自定义WordPress侧边栏

WordPress侧边栏是许多WordPress网站上的固定装置。它为您的内容提供了一个垂直空间,您可以在其中帮助读者导航、增加电子邮件列表或社交关注、展示广告等。 因为它是许多WordPress网站不可或缺的一部分,所以我们认为侧边栏值得拥有自己的大型指南。在这…

【leetcode题解C++】763.划分字母区间 and 56.合并区间 and 738.单调递增的数字

763. 划分字母区间 给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s 。 返回一个表示每个字符串片段的长度的…

【AIGC】开源声音克隆GPT-SoVITS

GPT-SoVITS 是由 RVC 创始人 RVC-Boss 与 AI 声音转换技术专家 Rcell 共同开发的一款跨语言 TTS 克隆项目,被誉为“最强大中文声音克隆项目” 相比以往的声音克隆项目,GPT-SoVITS 对硬件配置的要求相对较低,一般只需 6GB 显存以上的 GPU 即可…

物体检测-系列教程8:YOLOV5 项目配置

1、项目配置 yolo的v1、v2、v3、v4这4个都有一篇对应的论文,而v5在算法上没有太大的改变,主要是对v4做了一个更好的工程化实现 1.1 环境配置 深度学习环境安装请参考:PyTorch 深度学习 开发环境搭建 全教程 要求torch版本>1.6&#xf…

HBASE学习九:数据写入 -> BulkLoad

1、功能 在实际生产环境中,有这样一种场景:用户数据位于HDFS中,业务需要定期将这部分海量数据导入HBase系统,以执行随机查询更新操作。这种场景如果调用写入API进行处理,极有可能会给RegionServer带来较大的写入压力: 引起RegionServer频繁f lush,进而不断compact、spl…

【Java EE初阶二十一】http的简单理解(二)

2. 深入学习http 2.5 关于referer Referer 描述了当前页面是从哪个页面跳转来的,如果是直接在地址栏输入 url(或者点击收藏夹中的按钮) 都是没有 Referer。如下图所示: HTTP 最大的问题在于"明文传输”,明文传输就容易被第三方获取并篡改. …

#gStore-weekly | gStore最新版1.2之新增内置高级函数详解(一)

gStore1.2版本新增了七个高级函数,我们第2期将继续介绍的高级函数为:整体/局部集聚系数(clusterCoeff)、鲁汶算法(louvain)、K跳计数(kHopCount)/K跳邻居(kHopNeighbor&a…

Javaopp面向对象部分核心知识梳理

目录 前言: 一.面向对象和面向过程 面向过程 面向对象 面向过程与面向对象 二.类和对象 类 概念 成员变量(静态成员变量 和 非静态成员变量) 成员方法(静态成员方法 和 非静态成员方法) 代码块(实…

React之拖动组件的设计(一)

春节终结束了,忙得我头疼。终于有时间弄自己的东西了。今天来写一个关于拖动的实例讲解。先看效果: 这是一个简单的组件设计,如果用原生的js设计就很简单,但在React中有些事件必须要多考虑一些。这是一个系列的文章,…

Linux CAfile 文件下的/ca-bundle.crt怎么生成的

在配置Linux Nginx SSL证书后,通过服务器访问域名时发现,服务器返回的CA证书是:/etc/pki/tls/certs/ca-bundle.crt 正式我在使用Spring Native安装了Docker自动生成的,而且开启了Docker的自启动,如果你和我一样&#x…

常见的几种HTTP状态码

HTTP状态码用于告知客户端与服务器之间发生的情况,以下是一些常见的HTTP状态码及其含义: 1xx 信息性状态码(Informational): 100 Continue:收到请求的初始部分,客户端应继续请求。101 Switching…

10MARL深度强化学习 Value Decomposition in Common-Reward Games

文章目录 前言1、价值分解的研究现状2、Individual-Global-Max Property3、Linear and Monotonic Value Decomposition3.1线性值分解3.2 单调值分解 前言 中心化价值函数能够缓解一些多智能体强化学习当中的问题,如非平稳性、局部可观测、信用分配与均衡选择等问题…

从零开始学习Netty - 学习笔记 - NIO基础 - 文件编程:FileChannel,Path,Files

3.文件编程 3.1.FileChannel FileChannel只能工作在非阻塞模式下面,不能和selector一起使用 获取 不能直接打开FIleChannel,必须通过FileInputSream,或者FileOutputSetream ,或者RandomAccessFile来获取FileChannel 通过FileIn…

互联网高科技公司领导AI工业化,MatrixGo加速人工智能落地

作者:吴宁川 AI(人工智能)工业化与AI工程化正在引领人工智能的大趋势。AI工程化主要从企业CIO角度,着眼于在企业生产环境中规模化落地AI应用的工程化举措;而AI工业化则从AI供应商的角度,着眼于以规模化方式…

Rust ?运算符 Rust读写txt文件

一、Rust ?运算符 ?运算符:传播错误的一种快捷方式。 如果Result是Ok:Ok中的值就是表达式的结果,然后继续执行程序。 如果Result是Err:Err就是整个函数的返回值,就像使用了return &#xff…

电脑wifi丢失修复

当你打开电脑突然发现wifi功能不见了,可以先查看一下网卡的状态 在控制面板中找到设备管理器,打开就能找到网络适配器, 我这里是修复过的,wifi丢失后这里可能会显示WALN是丢失的,其他项显示黄色感叹号。 如何修复呢…

Go语言中的TLS加密:深入crypto/tls库的实战指南

Go语言中的TLS加密:深入crypto/tls库的实战指南 引言crypto/tls库的核心组件TLS配置:tls.Config证书加载与管理TLS握手过程及其实现 构建安全的服务端创建TLS加密的HTTP服务器配置TLS属性常见的安全设置和最佳实践 开发TLS客户端应用编写使用TLS的客户端…

[游戏开发][虚幻5]新建项目注意事项

鼠标右键点击Client.uproject文件,可以看到三个比较关键的选项, 启动游戏,生成sln解决方案,切换引擎版本 断点调试 C代码重要步骤 如果你想断点调试C代码,则必须使用使用代码编译启动引擎,你需要做几个操作…