js-运算符 ||

基本语法和作用

javascript 复制代码
// 基本格式
const func = () => expression || defaultValue;

// 含义:如果 expression 是假值,就返回 defaultValue

工作原理

逻辑或的短路特性

javascript 复制代码
// || 的运算规则:
// 1. 从左到右计算
// 2. 返回第一个为"真"的值
// 3. 如果都是"假",返回最后一个值

const a = false || "默认值";  // "默认值"
const b = "有值" || "默认值"; // "有值"
const c = 0 || 100;          // 100(0 是假值)
const d = null || "默认";    // "默认"
const e = undefined || "默认"; // "默认"
const f = "" || "非空";      // "非空"

在隐式返回中的实际应用

1. 环境变量默认值

javascript 复制代码
// 你例子中的用法
export const bundleType = () => process.env.BUNDLE || 'dev';

// 相当于
export const bundleType = () => {
  if (process.env.BUNDLE) {
    return process.env.BUNDLE;
  } else {
    return 'dev';
  }
};

2. 函数参数默认值

复制代码
// 旧版(ES5)的参数默认值写法
const greet = (name) => name || '访客';

console.log(greet('张三'));  // "张三"
console.log(greet(''));      // "访客"
console.log(greet(null));    // "访客"
console.log(greet());        // "访客"

// ES6+ 更推荐用默认参数
const greet = (name = '访客') => name;

3. 对象属性安全访问

复制代码
const getUserName = (user) => user?.name || '匿名用户';

// 使用
console.log(getUserName({ name: '张三' }));  // "张三"
console.log(getUserName({}));               // "匿名用户"
console.log(getUserName(null));             // "匿名用户"

4. API 响应数据处理

复制代码
// 处理可能不存在的数组
const getFirstItem = (data) => data?.[0] || {};

// 处理嵌套对象
const getConfigValue = (config) => 
  config?.settings?.theme?.color || 'default-blue';

// 处理函数返回值
const getCachedData = (key) => 
  localStorage.getItem(key) || fetchData(key);

??(空值合并运算符)的区别

特性 ` ` ??
假值处理 所有假值都触发默认值 nullundefined触发
0 的处理 0 → 默认值 0 → 0
空字符串 "" → 默认值 "" → ""
false false → 默认值 false → false
示例 value || "默认" value ?? "默认"
复制代码
// 对比示例
const value1 = 0;
console.log(value1 || 100);   // 100(0 是假值)
console.log(value1 ?? 100);   // 0(0 不是 null/undefined)

const value2 = '';
console.log(value2 || '默认'); // "默认"
console.log(value2 ?? '默认'); // ""

const value3 = false;
console.log(value3 || true);  // true
console.log(value3 ?? true);  // false

// 应该使用 ?? 的场景
const config = {
  timeout: 0,      // 0 是有效配置
  retry: false,    // false 是有效配置
  label: ''        // 空字符串是有效配置
};

// ❌ 错误:会覆盖有效配置
const timeout = config.timeout || 5000;  // 得到 5000,而不是 0
const retry = config.retry || true;     // 得到 true,而不是 false

// ✅ 正确:使用 ??
const timeout = config.timeout ?? 5000;  // 得到 0
const retry = config.retry ?? true;     // 得到 false

注意事项

1. 小心数字 0

复制代码
// 问题:0 是有效的价格,但会被当作假值
const getPrice = () => process.env.PRICE || 100;
// 如果 PRICE=0,会返回 100 而不是 0

// 解决方案1:使用 ??
const getPrice = () => process.env.PRICE ?? 100;

// 解决方案2:显式检查
const getPrice = () => 
  process.env.PRICE !== undefined ? process.env.PRICE : 100;

2. 避免过度嵌套

复制代码
// ❌ 难以阅读
const result = a || b || c || d || e || 'default';

// ✅ 更好
const getResult = () => {
  if (a) return a;
  if (b) return b;
  if (c) return c;
  if (d) return d;
  if (e) return e;
  return 'default';
};

3. 在箭头函数中的限制

复制代码
// ❌ 错误:多行逻辑不能用隐式返回
const complexLogic = (x) => 
  if (x > 0) {
    return '正数';
  } else {
    return '非正数';
  }

// ✅ 正确:用三元运算符
const complexLogic = (x) => 
  x > 0 ? '正数' : '非正数';

// ✅ 或者用花括号显式返回
const complexLogic = (x) => {
  if (x > 0) {
    return '正数';
  } else {
    return '非正数';
  }
};

总结

||在隐式返回中的核心用途:提供默认值

复制代码
// 核心模式
() => value || defaultValue

// 等价于
() => {
  if (value) {
    return value;
  } else {
    return defaultValue;
  }
}

何时使用

  1. 当值不存在(nullundefined''0false都可接受为"不存在"时)

  2. 简单逻辑,需要简洁写法

  3. 环境变量、配置项、用户输入等需要默认值的场景

注意事项

  • 注意 0false''等有效值被覆盖的问题

  • 对于数字,考虑使用 ??

  • 复杂逻辑还是用显式 if-else更清晰

相关推荐
CodeSheep2 小时前
公司开始严查午休…
前端·后端·程序员
哟哟耶耶2 小时前
component-Echarts圆环数据展示-延长线,label,鼠标移动提示,圆环数据中心总数,信息面板
前端·javascript·echarts
全栈软件开发2 小时前
Fidelity充电桩投资理财系统源码-前端uniapp纯源码+后端PHP
前端·uni-app·php
程序员刘禹锡2 小时前
文档流与盒子模型 (12.25日)
前端·css·css3
plmm烟酒僧2 小时前
使用 OpenVINO 本地部署 DeepSeek-R1 量化大模型(第二章:前端交互与后端服务)
前端·人工智能·大模型·intel·openvino·端侧部署·deepseek
Rhys..2 小时前
js-三元运算符
前端·javascript·数据库
不是,你来真的啊?2 小时前
Vue3响应式原理(源码)【reactive,ref,computed】
前端·vue·源码
snow@li2 小时前
前端:拖动悬浮小窗
开发语言·前端·javascript
2301_796512522 小时前
ModelEngine平台创建知识库体系 ,帮助“前端职业导航师”定制化私域知识累积
前端·modelengine