JavaScript判空设默认值的几种写法

 前端面试题库 (面试必备)            推荐:★★★★★

地址:前端面试题库

实践中需要给某个变量赋值时,若数据来源不可控,通常会给它设置一个默认值(就像空对象模式一样)。JavaScript中有很多语法支持设置这样的默认值,比如函数参数默认值,解构赋值默认值等。但本文主要讨论手动赋值时的3默认值设置方式:

  1. 使用条件判断设置默认值,如:let result = input || {}
  2. 使用空判断运算符,如:let result = input ?? {}
  3. 配合typeof判断类型设置默认值,如:let result = typeof(input) !== 'undefined' ? input : {}

||运算符

  这种形式主要利用了 Boolean() 类型转换以及 || 运算符的短路特性,其也可改写成三目运算符(?:)或If-else语句形式;受布尔类型转换限制,所有的 假值都会被认为未赋值。

// 当 input 为:undefined、null、''、0、NaN、false 时会被忽略
let input;
// 即 result 值不会为:undefined、null、''、0、NaN、false
let result;result = input || {};// 变体(1):三目运算符形式
result = input ? input : {};
// 变体(2):If-else 语句
if(input) {result = input;
} else {result = {};
}// 若只涉及一个变量,还可简写
obj ||= {};

??运算符

  由于 || 会忽略所有假值,TC39在ES2020的提案里提出 ?? 运算符,仅当左侧运算数为 null 或 undefined 时,才会计算右侧表达式。多配合 ?. 可选链式运算符一起使用。

// 当 input 为:undefined、null 时会被忽略
let input;
// 即 result 值不会为:undefined、null;可以是:''、0、NaN、false
let result;result = input ?? {}; // 若只涉及一个变量,还可简写
obj ??= {};

typeof运算符

  还有场景,只有在输入为 undefined 时才认为是无效输入,即 null 被认为是有效输入。此时可使用 typeof 运算符判断输入类型是否为 undefined 来区分;若已明确输入变量已经声明,则可将变量和 undefined 比较,通过其是否相等来判断。

// 当 input 为:undefined 时会被忽略
let input;
// 即 result 值不会为:undefined;可以是:null、''、0、NaN、false
let result;result = (typeof(input) !== 'undefined') ? input : {};// 变体:直接和 undefined 判断,需注意若input未声明会报错
result = (input !== undefined) ? input : {};

总结

  在面向对象编程过程中,大多场景变量是引用对象的,这些情况下 ?? 配合 ?. 会更符合现代编程语言的写法,也是官方推荐使用的。

const EMPTY_WALLET = {money: 0
}function consume(user = null, goods = null) {if (null === (goods?.price ?? null)) {return false;}let wallet = user?.info?.wallet ?? EMPTY_WALLET;if (wallet.money < goods.price) {return false;}wallet.money -= goods.price;return true;
}

前端面试题库 (面试必备)            推荐:★★★★★

地址:前端面试题库

 

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

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

相关文章

python编程中有哪些方便的调试方法

大家好&#xff0c;给大家分享一下一个有趣的事情&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 对于每个程序开发者来说&#xff0c;调试几乎是必备技能。常用Pycharm编辑器里的方法有Print大法、log大法&#xff0c;但缺少类似Matlab的…

敏感挂载binfmt_misc容器逃逸复现和分析

前言 对于/proc下有很多挂载会导致容器逃逸&#xff0c;其中binfmt_misc就是一种可以利用的逃逸挂载 binfmt_mics 实验 touch test_fmt_intp echo aaa > test_fmt echo #!/bin/sh > test_fmt_intp echo >> test_fmt_intp chmod x test_fmt_intp echo :test_fmt…

怎么开通Tik Tok海外娱乐公会呢?

TikTok作为全球知名的社交媒体平台&#xff0c;吸引了数亿用户的关注和参与。许多公司和个人渴望通过开通TikTok直播公会进入这一领域&#xff0c;以展示自己的创造力和吸引更多粉丝。然而&#xff0c;成为TikTok直播公会并非易事&#xff0c;需要满足一定的门槛和申请找cmxyci…

【日常积累】Linux之init系统学习

init系统简介: Linux 操作系统的启动首先从 BIOS 开始&#xff0c;接下来进入 boot loader&#xff0c;由 bootloader 载入内核&#xff0c;进行内核初始化。内核初始化的最后一步就是启动 pid 为 1 的 init 进程&#xff0c;这个进程是系统的第一个进程&#xff0c;它负责产生…

银河麒麟服务器v10 sp1 .Net6.0 上传文件错误

上一篇&#xff1a;银河麒麟服务器v10 sp1 部署.Net6.0 http https_csdn_aspnet的博客-CSDN博客 .NET 6之前&#xff0c;在Linux服务器上安装 libgdiplus 即可解决&#xff0c;libgdiplus是System.Drawing.Common原生端跨平台实现的主要提供者&#xff0c;是开源mono项目。地址…

封装form表单

目录 1. 源码 2. 其他页面引用 ps&#xff1a;请看完看明白再复用 1. 源码 <template><div style"width: 100%; height: 100%" class"form-condition"><!-- 普通表单 --><el-card shadow"hover" class"cardheigh…

AQS的原理及应用

文章目录 AQS引言AQS 的原理AQS 应用举例1:Semaphore举例2:ReentrantLockAQS 的案例分析问题背景解决方案AQS 引言 在我们的日常生活和工作中,往往需要协调各个线程之间的执行顺序和资源使用,而AQS(AbstractQueuedSynchronizer)即为 Java 并发包中提供的一种解决办法。…

ubuntu 部署 ChatGLM-6B 完整流程 模型量化 Nvidia

ubuntu 部署 ChatGLM-6B 完整流程 模型量化 Nvidia 初环境与设备环境准备克隆模型代码部署 ChatGLM-6B完整代码 ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#x…

力扣 322. 零钱兑换

题目来源&#xff1a;https://leetcode.cn/problems/coin-change/description/ C题解&#xff08;来源代码随想录&#xff09;&#xff1a;题目中说每种硬币的数量是无限的&#xff0c;可以看出是典型的完全背包问题。动规五部曲分析如下&#xff1a; 确定dp数组以及下标的含义…

深入理解设计模式-创建型之建造者模式(与工厂区别)

什么是建造者设计模式&#xff1f;和工厂设计模式有什么区别 建造者设计模式&#xff08;Builder Design Pattern&#xff09;和工厂设计模式&#xff08;Factory Design Pattern&#xff09;都是面向对象设计中的创建型模式&#xff0c;但它们解决的问题和应用场景有所不同。…

原码、反码、补码,进制转换,有符号数和无符号数转换

计算机底层存储数据时&#xff0c;存储的是数据对应的二进制数字。对于整型数据&#xff0c;其二进制表示形式有三种&#xff0c;分别是&#xff1a;原码、反码、补码&#xff0c;而实际存储的是整型数据的补码。 原码、反码以及补码都是有符号的&#xff0c;其中最高位存放符…

带你掌握Stable Diffution商业级玩法

课程介绍 学习地址 《Stable Diffusion商业级玩法》通过详细讲解AI绘画技巧、实操演示和个性化指导&#xff0c;帮助您从零基础成为绘画高手&#xff0c;帮助您有效推广产品或服务&#xff0c;提升市场份额。教您掌握稳定扩散绘画技巧&#xff0c;开启艺术创作新篇章。

Opencv 之ORB特征提取与匹配API简介及使用例程

Opencv 之ORB特征提取与匹配API简介及使用例程 ORB因其速度较快常被用于视觉SLAM中的位姿估计、视觉里程、图像处理中的特征提取与匹配及图像拼接等领域本文将详细给出使用例程及实现效果展示 1. API 简介 创建 static Ptr<ORB> cv::ORB::create (int nfeatures 500…

无涯教程-Perl - use函数

描述 此函数将MODULE导出的所有功能(或仅LIST引用的功能)导入当前包的名称空间。有效等效于- BEGIN { require "Module.pm"; Module->import(); }也用于在当前脚本上强加编译器指令(编译指示),尽管从本质上讲它们只是模块。 请注意,use语句在编译时进行判断。在…

springcloud3 hystrix实现服务熔断的案例配置3

一 hystrix的熔断原理 1.1 hystrix的熔断原理 在springcloud的框架里&#xff0c;熔断机制是通过hystrix实现&#xff0c;hystrix会监控服务之间的调用。当失败调用达到一定的阈值&#xff0c;默认是5s内失败20次&#xff0c;就会启用hystrix的熔断机制&#xff0c;使用命Hy…

神经网络基础-神经网络补充概念-44-minibatch梯度下降法

概念 小批量梯度下降法&#xff08;Mini-Batch Gradient Descent&#xff09;是梯度下降法的一种变体&#xff0c;它结合了批量梯度下降&#xff08;Batch Gradient Descent&#xff09;和随机梯度下降&#xff08;Stochastic Gradient Descent&#xff09;的优点。在小批量梯…

Apache Doris大规模数据使用指南

目录 发展历史 架构介绍 弹性MPP架构-极简架构 逻辑架构 基本访问架构 分区 创建单分区表

【C++ 记忆站】缺省参数

文章目录 缺省参数的概念缺省参数的分类1、全缺省参数2、半缺省参数 缺省参数实际应用场景 缺省参数的概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参 正常调用一…

音频解码及如何在Java实现

本人并不干这个&#xff0c;但是被迫下水了解了一下这个&#xff0c;稍微做了一下整理。再就是感觉现在网上以及ChatGPT在这方面给出的答案太水了&#xff0c;在此开辟一篇。无意放出代码&#xff0c;这里只介绍一些可能重要的点。 本来以为有了ChatGPT写这些就没有必要了&…

Docker部署ES服务,canal全量同步的时候内存爆炸,ES/Canal Adapter自动关闭,CPU100%

文章目录 问题解决方案1. 对ES的限制2. 对Canal-Adapter的限制 问题 使用canal-adapter全量同步&#xff08;参考Canal Adapter1.1.5版本API操作服务&#xff0c;手动同步数据&#xff08;4&#xff09;&#xff09;的时候 小批量数据可以正常运行&#xff08;几千条&#xf…