首页 > 编程语言 >两个新出的 JavaScript 运算符

两个新出的 JavaScript 运算符

时间:2024-11-14 15:32:23浏览次数:1  
标签:新出 JavaScript 运算符 操作符 user && let 赋值

在 ECMAScript 2021(ES12)中,JavaScript 引入了新的逻辑赋值操作符 &&=??=。这些操作符将逻辑运算符与赋值运算符相结合,提供了更加简洁、直观的赋值方式。

虽然已经进入标准比较久了,但是我在实际开发中见到的还比较少,今天我们一起来学习下。

逻辑与赋值操作符 &&=

&&= 的工作原理

&&= 操作符是逻辑与运算符(&&)和赋值运算符(=)的结合。它的作用是:仅当左侧变量为真值(truthy)时,才将右侧的值赋给左侧变量。传统的写法需要使用 if 语句或逻辑运算符,&&= 则提供了更为简洁的方式。

传统写法对比:

// 使用 if 语句
if (x) {
  x = y;
}

// 使用逻辑与运算符
x = x && y;

// 使用 `&&=` 操作符(ES2021)
x &&= y;

真值和假值的概念

在 JavaScript 中,以下值被认为是假值(falsy)

  • false
  • 0
  • '' (空字符串)
  • null
  • undefined
  • NaN

其他所有值都被视为真值(truthy)

示例解析

示例 1:用户登录状态

let isLoggedIn = true;
isLoggedIn &&= getUserData(); // 如果已经登录,获取用户数据

function getUserData() {
  return { name: 'ConardLi', age: 17 };
}

// 结果:isLoggedIn 变为 { name: 'ConardLi', age: 17 }

示例 2:库存更新

let stock = 17;

function sell(quantity) {
  stock >= quantity &&= stock - quantity;
}

sell(5); // stock 为 5
sell(17); // stock 保持为 5,因为 5 >= 17 为 false

在上述示例中,sell 函数仅在库存足够时才减少库存,防止出现负库存的情况。

应用场景

(1)条件更新属性

let config = {
  debugMode: true,
  logLevel: null
};

// 仅当 debugMode 为真时,设置 logLevel
config.debugMode &&= (config.logLevel = 'verbose');

// 结果:config.logLevel 为 'verbose'

(2)链式判断

let user = {
  isActive: true,
  hasMembership: true
};

// 仅当用户活跃且有会员资格时,给予折扣
user.isActive &&= user.hasMembership &&= applyDiscount();

function applyDiscount() {
  return '已应用折扣';
}

// 结果:user.hasMembership 变为 '已应用折扣'

空值合并赋值操作符 ??=

??= 的工作原理

??= 操作符结合了空值合并运算符(??)和赋值运算符(=)。它的作用是:仅当左侧变量为 nullundefined 时,才将右侧的值赋给左侧变量。这有助于在变量未被初始化时提供默认值。

传统写法对比:

// 使用 if 语句
if (options.timeout === null || options.timeout === undefined) {
  options.timeout = 3000;
}

// 使用空值合并运算符
options.timeout = options.timeout ?? 3000;

// 使用 `??=` 操作符(ES2021)
options.timeout ??= 3000;

与其他赋值方式的比较

问题:

  • 逻辑或 || 会将 0''false 等合法值视为需要赋默认值的情况,可能导致意外的结果。
let delay = 0;
delay = delay || 1000; // delay 被误赋值为 1000

解决方案:

  • ??= 仅在变量为 nullundefined 时才赋值,避免了上述问题。
let delay = 0;
delay ??= 1000; // delay 保持为 0

使用三元运算符:

user.name = (user.name !== null && user.name !== undefined) ? user.name : 'Anonymous';

问题: 代码较为冗长,可读性不高。

使用 ??=

user.name ??= 'Anonymous';

优势: 简洁明了,仅在变量为 nullundefined 时才赋值,不影响其他假值。

应用场景

??= 操作符非常适合为可能未定义的变量设置默认值,且不会干扰有效的假值。

示例:

let score = 0;
score ??= 100;    // 保持为 0

let tag = '';
tag ??= 'default'; // 保持为 ''

let active = false;
active ??= true;   // 保持为 false

配置默认参数:

function initializeSettings(settings) {
  settings.theme ??= 'light';
  settings.notificationsEnabled ??= true;
  settings.autoSaveInterval ??= 300;

  return settings;
}

最后

JavaScript 的 &&=??= 操作符为我们提供了更为简洁和精确的赋值方式:

  • &&= 操作符: 仅在左侧变量为真值时才进行赋值,适合用于需要在保持假值的同时,根据真值条件更新变量的场景。
  • ??= 操作符: 仅在左侧变量为 nullundefined 时才进行赋值,适合用于为未定义或空值变量设置默认值的场景。

标签:新出,JavaScript,运算符,操作符,user,&&,let,赋值
From: https://www.cnblogs.com/houxianzhou/p/18546146

相关文章

  • vite3+vue3 实现前端部署加密混淆 javascript-obfuscator
    安装pnpminstalljavascript-obfuscator安装之后在项目根目录新建一个obfuscator.js在obfuscator.js写入以下代码直接复制粘贴`/**@用法vite打包完成后,使用命令行nodejs执行本文件:nodeobfuscator.js它会挨个把里面的js文件做混淆然后替换@说明本质就是依......
  • 24.11.12 JavaScript2
    prompt()confirm()这些函数会阻止js解析器(js解析器执行引擎读取运行js)执行不要使用2history对象历史记录对象对应浏览器前进后退按钮history在历史记录里back前进forward后退go0当前文档负数后......
  • 24.11.13 Javascript3
    Javascript31.dom元素获取查找元素的函数getElementById("id值")查找到唯一一个元素getElementsByClassName("class值")查找指定class的元素数组getElementsByTagName("标签名")查找指定标签名的元素......
  • JavaScript新版本6个新功能盘点
    JavaScript在2024年更新引入了6个关键功能。从使文本和日期更易于处理,到程序等待和协同工作的新方法,甚至使模式更容易查找。我们一起来看看吧!01、格式正确的Unicode字符串格式良好的Unicode字符串引入了确保JavaScript中的字符串以UTF-16编码正确格式化的方法。此......
  • 数据类型和运算符
    数据类型动态类型编程语言运行时判断静态类型的编程语言:Go、C、在开发的时候,就需要给一些定义的变量赋值空间大小。C需要自己去开辟这个空间数据类型:每种在Go语言中出现的基本数据类型,会有一个默认的空间大小。1、布尔类型数据布尔型的值只可以是常量true或者......
  • JAVASCRIPT 将推出新的时间、日期和集合功能
    我们预计将在ECMAScript2025中看到的重大JavaScript新功能,以及导致它们延迟的讨论。译自JavaScriptDueforNewTime,DateandSetFeaturesNextYear,作者MaryBranscombe。JavaScript下一个年度更新将在新年初确定其包含的功能,包括在2025年3月前达到最终第四阶......
  • JavaScript常用对象方法一:字符串(string)
    string对象有很多方法,但一般开发里,一些方法很少用到,比如concat(),他的作用似乎将两个字符串拼接起来,但开发时,使用加号也能实现字符串拼接效果,所以这种方法就不介绍了。这里只介绍一些开发常用的方法,不多,但都很重要,属于必须掌握的方法1.indexOf()返回某个指定的字符串值在字符串......
  • javaScript对象函数初相识
    1.1、对象初相识1.1.1、对象的初识1.1.1.1、对象的定义现实生活中,万物皆对象,对象是一个具体的事物,看得见摸得着的实物。例如一本书,一辆汽车,一个人可以是“对象”,一个数据库,一张网页,一个与远程服务器的连接也可以是“对象”。例子:明星、女朋友、班主任、苹果、手机周星驰......
  • javascript如何进行冒泡排序?
    冒泡排序的规律有一个数组[5,4,3,2,1],假如说要重新排序,进行升序排序,冒泡排序步骤如下5和4比较,5大,5和4交换位置[4,5,3,2,1]5和3比较,5大,5和3交换位置[4,3,5,2,1]5和2比较,5大。5和2交换位置[4,3,2,5,1]5和1比较,5大,5和1交换位置[4,3,2,1,5]5排到了最后一位4开始和后面的......
  • ECMAScript 安全赋值运算符 (?=) 提案介绍及其 Polyfill
    本文介绍最新的ECMAScript安全赋值运算符提案以及相应的替代实现前言我们经常会跟try/catch打交道,但如果你写过Go或者Rust就会发现在这两种语言中是没有try/catch的,那么这些语言怎么进行错误捕获呢Go:Errorhandlingf,err:=os.Open("filename.ext")iferr......