前端js用法:val ?? 0 和 val || 0

在JavaScript中,val ?? 0 是**空值合并运算符(Nullish Coalescing Operator)**的用法。

具体含义

javascript

复制代码
val ?? 0
  • 如果 valnullundefined,返回 0

  • 如果 val 是其他任何值(包括 0false'' 空字符串),返回 val 本身

|| 运算符的区别

javascript

复制代码
let val = 0

val ?? 10  // 返回 0(val 不是 null/undefined)
val || 10  // 返回 10(val 是假值 false)

javascript

复制代码
let val = ''

val ?? 'default'  // 返回 ''(空字符串)
val || 'default'  // 返回 'default'(空字符串是假值)

其他类似用法

1. 可选链运算符(Optional Chaining)

javascript

复制代码
// 安全访问嵌套属性
const name = user?.profile?.name ?? '匿名'

// 安全调用函数
const result = obj.method?.() ?? 'default'

// 数组安全访问
const item = arr?.[0] ?? '无数据'

2. 逻辑或运算符(Logical OR)

javascript

复制代码
// 适用于任何假值的情况
const value = val || 0  // val为假值(false、0、''、null、undefined)时返回0

3. 三元运算符

javascript

复制代码
// 更灵活的条件判断
const result = val != null ? val : 0
const result = val !== undefined && val !== null ? val : 0

4. 默认参数(函数参数)

javascript

复制代码
function calculate(amount = 0) {
  return amount * 1.1
}

5. 解构赋值默认值

javascript

复制代码
const { price = 0, quantity = 1 } = item
const total = price * quantity

6. 结合使用示例

javascript

复制代码
// 组合使用:安全访问 + 默认值
const price = product?.pricing?.discountPrice ?? product?.pricing?.originalPrice ?? 0

// 函数默认返回值
const getUserName = (user) => user?.name ?? '游客'

// 表单数据处理
const formData = {
  quantity: inputQuantity ?? 1,
  price: parseFloat(inputPrice) || 0,
  notes: inputNotes || '',
  discount: discount ?? 0
}

浏览器兼容性

  • ?? 运算符:ES2020+,现代浏览器都支持

  • ?. 运算符:ES2020+,现代浏览器都支持

  • 如果需要兼容旧浏览器,可以使用 Babel 转译

实用建议

javascript

复制代码
// 推荐使用 ?? 的场景:
// 1. 需要区分 0/false/'' 和 null/undefined 时
const count = receivedCount ?? 0  // 0 是有效值

// 推荐使用 || 的场景:
// 1. 所有假值都应该使用默认值时
const displayName = username || '匿名用户'  // 空字符串也显示默认名

// 2. 布尔值判断
const isEnabled = featureFlag || false

这两个运算符是现代JavaScript开发中非常有用的工具,可以大大简化空值检查和默认值设置的代码。

分析示例

其中,

// 组合使用:安全访问 + 默认值

const price = product?.pricing?.discountPrice ?? product?.pricing?.originalPrice ?? 0

这段代码是JavaScript/TypeScript中的可选链操作符(?.)和空值合并操作符(??)的组合使用。让我为你详细解释:

分解代码:

javascript

复制代码
const price = 
  product?.pricing?.discountPrice ??  // 第一选择:折扣价
  product?.pricing?.originalPrice ??  // 第二选择:原价
  0;                                 // 默认值:0

逐步解释:

1. 可选链操作符 ?.

  • product?.pricing:如果 product 存在,则访问 product.pricing;如果 productnullundefined,则返回 undefined

  • product?.pricing?.discountPrice:如果 productproduct.pricing 都存在,则访问 discountPrice

2. 空值合并操作符 ??

  • a ?? b:如果 a 不是 null 也不是 undefined,则返回 a;否则返回 b

执行逻辑:

代码会按顺序检查以下条件:

  1. 优先尝试获取折扣价

    javascript

    复制代码
    product?.pricing?.discountPrice
    • 如果 product 存在且 pricing 存在且 discountPrice 有值 → 返回 discountPrice
  2. 如果折扣价不存在,尝试获取原价

    javascript

    复制代码
    product?.pricing?.originalPrice
    • 如果 discountPrice 不存在(null/undefined)→ 检查 originalPrice
  3. 如果两者都不存在,返回默认值 0

    • 如果 discountPriceoriginalPrice 都不存在 → 返回 0

等价于传统写法:

javascript

复制代码
let price = 0;

if (product && product.pricing) {
  if (product.pricing.discountPrice !== null && 
      product.pricing.discountPrice !== undefined) {
    price = product.pricing.discountPrice;
  } else if (product.pricing.originalPrice !== null && 
             product.pricing.originalPrice !== undefined) {
    price = product.pricing.originalPrice;
  }
}

示例:

javascript

复制代码
// 示例1:有折扣价
const product1 = {
  pricing: {
    discountPrice: 80,
    originalPrice: 100
  }
};
// price = 80

// 示例2:没有折扣价,但有原价
const product2 = {
  pricing: {
    originalPrice: 100
  }
};
// price = 100

// 示例3:pricing为空
const product3 = {};
// price = 0

// 示例4:product为null
const product4 = null;
// price = 0

关键点:

  • 可选链 ?. 防止访问 undefinednull 的属性时出错

  • 空值合并 ?? 只在左侧为 nullundefined 时才使用右侧值

  • 代码简洁且安全,避免了复杂的条件判断

相关推荐
3824278271 天前
JS表单验证:className与classList区别详解
js
REDcker1 天前
Android WebView 版本升级方案详解
android·音视频·实时音视频·webview·js·编解码
winfredzhang3 天前
[实战] Node.js + DeepSeek 打造智能档案归档系统:从混乱到有序的自动化之旅
css·node.js·js·deepseek api
梦凡尘4 天前
前端web端解析 Word、Pdf 文档文本内容
pdf·js
梦凡尘5 天前
Marked.js 的使用及相关问题解决
前端·js
想看一次满天星7 天前
某里231——AST解混淆流程
爬虫·python·ast·js·解混淆
Han.miracle8 天前
JavaScript 基础核心知识点闯关练习
css·js
冥界摄政王8 天前
CesiumJS学习第四章 替换指定3D建筑模型
3d·vue·html·webgl·js·cesium
曲幽9 天前
手把手搞定FastAPI静态文件:安全、上传与访问
css·python·fastapi·web·js·favicon·staticfiles
冥界摄政王10 天前
Cesium学习第二章 camera 相机
node.js·html·vue3·js·cesium