foo = foo || bar 的深入解析

news2024/9/24 1:25:28

目录

前言

用法

代码示例

理解

注意点

结论


前言

在JavaScript中,foo = foo || bar 是一种常见的编程模式,用于设置变量的默认值或者确保变量被赋值。这种写法利用了JavaScript中逻辑运算符的短路特性,即在逻辑运算中,一旦结果确定,就不再对后续的表达式进行计算。虽然这种写法简洁且高效,但它也有一些潜在的陷阱,需要开发者仔细理解。


用法

foo = foo || bar 的含义是:如果foo已经有值(并且值为真值),就保持foo的值不变;如果foo没有值(或者值为假值,如undefinednull0NaN''等),就将bar的值赋给foo


代码

function greet(name) {
  name = name || 'Guest';
  console.log('Hello, ' + name);
}

greet('Alice'); // 输出:Hello, Alice
greet();        // 输出:Hello, Guest

greet 函数接受一个参数 name,如果调用时没有提供这个参数,或者提供的参数是假值,那么 name 将被设置为默认值 'Guest'


理解

这种写法的背后是JavaScript中逻辑运算符的短路特性。在使用逻辑或运算符 || 时,如果第一个操作数是真值,那么整个表达式的结果就是第一个操作数的值,第二个操作数将不会被计算;如果第一个操作数是假值,那么整个表达式的结果就是第二个操作数的值。

这种写法非常简洁,可以用一行代码实现变量的默认值设置,避免了使用更冗长的 if 语句。但是,它也有一些需要注意的地方。


注意点

  1. 只有在变量的值为假值时才会被赋予新值。这意味着,如果变量的值为 0''(空字符串)、NaNnullundefined 或者 false,它将被赋予新值。在某些情况下,这可能不是你想要的行为。

  2. 确保默认值是你期望的类型。由于JavaScript是一种弱类型语言,不同类型的值之间可以自由转换,所以你需要确保提供的默认值是正确的类型,以避免潜在的类型转换问题。

  3. 在使用对象或数组作为默认值时要小心。如果你使用对象或数组作为默认值,你需要确保它不会在函数调用之间共享。


结论

foo = foo || bar 是一种在JavaScript中设置变量默认值的简洁方法。它利用了逻辑运算符的短路特性,可以用一行代码代替更冗长的条件语句。然而,使用这种方法时需要注意确保默认值的类型正确,并且要注意对于假值的处理。在合适的场景下,这种写法可以使代码更加简洁和易读。

foo = foo || bar 是JavaScript中常见的一种编写方式,用于设置变量的默认值。这个表达式的行为可以从几个方面来理解:

  1. 逻辑 OR (||) 操作符: JavaScript中的逻辑 OR (||) 操作符用于执行逻辑或运算。它返回两个操作数中的第一个“真值”(truthy)操作数,或者如果两者都是“假值”(falsy),则返回第二个操作数。在JavaScript中,“真值”是指在布尔上下文中转换为true的值,“假值”是指在布尔上下文中转换为false的值。假值包括nullundefined0falseNaN和空字符串("")。

  2. 赋值操作: foo = foo || bar中的赋值操作是将foo || bar的结果赋给foo。如果foo是真值,foo将保持不变;如果foo是假值,foo将被赋予bar的值。

  3. 默认值设置: 这种编写方式通常用于设置变量的默认值。如果foo已经有一个真值,它将保持不变;否则,它将接收bar的值作为默认值。

举例来说,假设我们有以下代码:

let foo;
let bar = "hello";
foo = foo || bar;
console.log(foo);  // 输出 "hello"

在这个例子中,由于fooundefined(一个假值),foo会被赋予bar的值,即"hello"

这种编写方式是一种简洁的方法来确保变量有一个有效的值,尤其是在处理可能未定义的变量时。然而,这种方法可能不适用于所有情况,特别是当0false或空字符串等假值是有效的值时。在这些情况下,可能需要使用其他方法来设置默认值,例如使用条件运算符或if语句。

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

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

相关文章

docker - window Docker Desktop升级

文章目录 前言docker - window Docker Desktop升级 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来…

通过el-tree 懒加载树,创建国家地区四级树

全国四级行政地区树数据库sql下载路径:【免费】全国四级地区(省市县)数据表sql资源-CSDN文库https://download.csdn.net/download/weixin_51722520/88469807?spm1001.2014.3001.5503 我在后台获取地区信息添加了限制,只获取parentid为当前的地…

使用 jdbc 技术升级水果库存系统(后端最终版本,不包含前端)

1、配置依赖 <dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.10</version></dependency><dependency><groupId>junit</groupId><…

释放搜索潜力:基于ES(ElasticSearch)打造高效的语义搜索系统,让信息尽在掌握[1.安装部署篇--简洁版],支持Linux/Windows部署安装

搜索推荐系统专栏简介&#xff1a;搜索推荐全流程讲解&#xff08;召回粗排精排重排混排&#xff09;、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战&#xff08;含码源&#xff09; 专栏详细介绍&#xff1a;搜索推荐系统专栏简介&#xff1a;搜索推荐全流程讲…

基于springboot零食商城管理系统

功能如图所示 摘要 这基于Spring Boot的零食商城管理系统提供了强大的购物车和订单管理功能。用户可以在系统中浏览零食产品&#xff0c;并将它们添加到购物车中。购物车可以保存用户的选购商品&#xff0c;允许随时查看已选择的商品和它们的数量。一旦用户满意&#xff0c;他们…

Geom2d_OffsetCurve解析

Geom2d_OffsetCurve (const Handle< Geom2d_Curve > &C, const Standard_Real Offset, const Standard_Boolean isNotCheckC0Standard_False) chatgpt解析&#xff1a;Geom2d_OffsetCurve 是 OpenCascade 中的函数&#xff0c;用于构造偏移曲线。下面是对该函数的参…

CDR和AI哪个软件更好用?

设计软件市场中&#xff0c;CorelDRAW和Adobe Illustrator&#xff08;简称AI&#xff09;无疑是两大重量级选手。它们各自拥有庞大的用户群和丰富的功能&#xff0c;但究竟哪一个更好用&#xff1f;本文将从多个角度出发&#xff0c;对这两款软件进行全面而深入的比较&#xf…

编曲宿主软件哪个更好用?

音乐编曲软件的出现使得音乐创作者能够克服时间和空间的限制&#xff0c;随时随地进行创作。随着信息时代的发展&#xff0c;使用编曲软件已成为音乐创作领域的主流。那么编曲软件哪个好用呢&#xff1f;我推荐这三款。 在业内&#xff0c;常用的音乐编曲软件包括Cubase、Logi…

RHCE8 资料整理(四)

RHCE8 资料整理 第四篇 存储管理第13章 硬盘管理13.1 对磁盘进行分区13.2 交换分区&#xff08;swap分区&#xff09; 第14章 文件系统14.1 了解文件系统14.2 了解硬链接14.3 创建文件系统14.4 挂载文件系统14.5 设置永久挂载14.6 查找文件14.7 find的用法 第15章 逻辑卷管理15…

QWidget|QFrame设置背景透明且可以带有边框颜色

QWidget|QFrame设置背景透明且可以带有边框颜色 《Qt》part 6 QSS Qt样式表——界面美化1【QT】QSS美化——基础知识Chapter1 QWidget|QFrame设置背景透明且可以带有边框颜色参考链接Chapter2 Qt 中设置窗体(QWidget)透明度的几种方法1. 设置窗体的背景色2. 使用函数 Chapter3 …

使用端口转发来访问集群中的应用

使用端口转发来访问集群中的应用 个人k8s集群信息&#xff1a; rootk8s-master:~# kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIM…

【源码】智慧导诊系统:告别排队等候,快速预约科室挂号!

去医院看病该挂什么科&#xff1f; 不知道该挂什么科我该问谁&#xff1f; 看到茫茫的排队就诊人群&#xff0c;心里绝望怎么办&#xff1f; 医院内部结构复杂&#xff0c;我要去的科室在哪里&#xff1f; 所有人都去咨询前台&#xff0c;前台压力大&#xff0c;患者也只 …

【ARM Trace32(劳特巴赫) 使用介绍 2 -- Trace32 cmm 脚本基本语法及常用命令】

文章目录 Trace32 CMM 概述1.1 Trace32 系统命令 SYStem1.1.1 Trace32 SYStem.CONFIG1.1.2 SYStem.MemAccess1.1.3 SYStem.Mode1.1.3.1 TRST-Resets the JTAG TAP controller and the CPU internal debug logic1.1.3.2 SRST- Resets the CPU core and peripherals 1.2 Trace32 …

原生mysql与mybatis执行update语句的差异

在做一个解除绑定的接口中&#xff0c;发现了这个一个问题&#xff1a; 连续对接口进行测试&#xff0c;发现一直fan返回解除成功&#xff0c;但是逻辑上应该是解除之后&#xff0c;在解除它后就应该回显已解除绑定才对 就一直找原因&#xff0c;sql中使用的是mybatis的…

常用的主流音乐编曲软件有哪些?

FL Studio是一款备受音乐人喜爱的超强编曲软件。最新的FL Studio版本将所有音频形式都视为采样&#xff0c;使得它在各个领域都有出色的表现。该软件操作简单&#xff0c;界面友好&#xff0c;非常适合新手全面学习和使用。此外&#xff0c;FL Studio完美支持Windows和Mac操作系…

内存-虚拟地址到物理内存地址转换

虚拟地址的位数 [rootnew ~]# cat /proc/cpuinfo | grep virtu | tail -1 address sizes : 46 bits physical, 48 bits virtual 高性能C之虚拟内存_哔哩哔哩_bilibili 第零层&#xff0c;每一项是4KB 512个4KB是2MB&#xff0c;第一层&#xff0c;每一项是1GB 512个2MB是…

✔ ★【备战实习(面经+项目+算法)】 10.27学习

✔ ★【备战实习&#xff08;面经项目算法&#xff09;】 坚持完成每天必做如何找到好工作1. 科学的学习方法&#xff08;专注&#xff01;效率&#xff01;记忆&#xff01;心流&#xff01;&#xff09;2. 每天认真完成必做项&#xff0c;踏实学习技术 认真完成每天必做&…

CVE-2022-32991靶场复现

靶场环境&#xff1a; 题目提示了该CMS的welcome.php中存在SQL注入攻击。 CVE官方给出的提示&#xff1a; welcome.php页面存在SQL注入&#xff0c;并且这个参数是eid 打开靶场环境&#xff1a; 页面是一个登陆注册的界面 用户注册&#xff1a; 1 010.com 123456 123456 点击Re…

多线程---认识线程

文章目录 什么是进程&#xff1f;如何管理进程&#xff1f;认识PCB了解进程调度的过程虚拟地址空间 什么是线程&#xff1f;进程 VS 线程Thread类的属性和方法Thread类的属性Thread类的方法构造方法普通方法 线程的状态 什么是进程&#xff1f; 进程&#xff0c;也叫做“任务”…

ZooKeeper中节点的操作命令(查看、创建、删除节点)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…