前端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 时才使用右侧值

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

相关推荐
REDcker6 小时前
浏览器端Web程序性能分析与优化实战 DevTools指标与工程清单
开发语言·前端·javascript·vue·ecmascript·php·js
爱上好庆祝13 小时前
学习js的第五天
前端·css·学习·html·css3·js
捉鸭子1 天前
某音a_bogus vmp逆向
爬虫·python·web安全·node.js·js
zhensherlock4 天前
Protocol Launcher 系列:Beorg 高效任务管理的协议支持
前端·javascript·typescript·node.js·自动化·github·js
我命由我123455 天前
JavaScript 开发 - 获取函数名称、获取函数参数数量、获取函数参数名称
开发语言·前端·javascript·css·html·html5·js
爱上好庆祝6 天前
学习js的第四天
前端·css·学习·html·css3·js
zhensherlock7 天前
Protocol Launcher 系列:Tally 快速计数器的深度集成
前端·javascript·typescript·node.js·自动化·github·js
爱上好庆祝8 天前
学习js的第三天
前端·css·人工智能·学习·计算机外设·js
zhensherlock8 天前
Protocol Launcher 系列:Working Copy 文件操作与高级命令详解
javascript·git·typescript·node.js·自动化·github·js
zhensherlock9 天前
Protocol Launcher 系列:Working Copy 提交与同步全攻略
javascript·git·typescript·node.js·自动化·github·js