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

简介: 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的提案里提出 ?? 运算符,仅当左侧运算数为 nullundefined 时,才会计算右侧表达式。多配合 ?.可选链式运算符一起使用。

// 当 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;
}

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

地址:前端面试题库

相关文章
|
5月前
|
JavaScript 前端开发 网络架构
JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】
JavaScript编码之路【对象的增强、ES6新特性之函数的默认值设置 、rest参数 (剩余参数)、拓展运算符、对象与数组的解构赋值】
59 1
|
前端开发
前端知识案例30-javascript基础语法-函数默认值
前端知识案例30-javascript基础语法-函数默认值
55 0
前端知识案例30-javascript基础语法-函数默认值
|
JavaScript
js基础笔记学习79-箭头函数得参数和参数默认值
js基础笔记学习79-箭头函数得参数和参数默认值
82 0
js基础笔记学习79-箭头函数得参数和参数默认值
|
JavaScript 前端开发
SpringMVC中通过@ResponseBody返回对象,Js中调用@ResponseBody返回值,统计剩余评论字数的js,@RequestParam默认值,@PathVariable的用法
1、SpringMVC中通过@ResponseBody返回对象,作为JQuery中的ajax返回值 package com.kuman.cartoon.controller;   import java.util.Map;   import javax.servlet.http.HttpServletRequest;   import org.apac
2963 0
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的客户关系管理系统附带文章源码部署视频讲解等
100 2
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的小区物流配送系统附带文章源码部署视频讲解等
134 4
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物援助平台附带文章源码部署视频讲解等
85 4
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的宠物交易平台附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的宠物交易平台附带文章源码部署视频讲解等
76 4
|
5月前
|
JavaScript Java 测试技术
基于springboot+vue.js+uniapp的大学生入伍人员管理系统附带文章源码部署视频讲解等
基于springboot+vue.js+uniapp的大学生入伍人员管理系统附带文章源码部署视频讲解等
94 4