「周更第8期」实用JS库推荐:decimal.j

引言

大家好,欢迎来到第8期的JavaScript库推荐!本期为大家介绍的是 decimal.js,一个专门用于高精度十进制数值计算的优秀工具库。

在日常开发中,我们经常遇到需要进行精确数值计算的需求,特别是在金融、电商、科学计算等领域。传统的JavaScript浮点数运算往往存在精度丢失的问题,比如经典的 0.1 + 0.2 !== 0.3 问题。这种精度问题在处理货币计算、科学数据分析时可能导致严重的业务错误。

decimal.js 正是为了解决这些痛点而生的,它以其高精度计算、丰富的数学函数、灵活的配置选项在同类库中脱颖而出,成为了精确数值计算的首选方案。无论你是前端开发者还是Node.js后端开发者,都能从这个库中受益。

本文将从decimal.js的核心特性、实际应用、性能表现、最佳实践等多个维度进行深入分析,帮助你全面了解这个优秀的工具库。

库介绍

基本信息

主要特性

  • 🚀 高精度计算:支持任意精度的十进制数值运算,彻底解决浮点数精度问题
  • 💡 丰富的数学函数:提供完整的数学运算方法,包括三角函数、对数、指数等
  • 🔧 灵活配置:支持精度、舍入模式、数值范围等多种配置选项
  • 📱 轻量级设计:体积小巧,无外部依赖,适合各种项目环境
  • 🛡️ 类型安全:提供完整的TypeScript类型定义
  • 性能优化:针对常见运算场景进行了性能优化

兼容性

  • 浏览器支持:支持所有现代浏览器,包括IE6+
  • Node.js支持:支持Node.js 0.10+
  • 框架兼容:与React、Vue、Angular等主流框架完全兼容
  • TypeScript支持:提供完整的TypeScript类型定义文件

安装使用

安装方式

bash 复制代码
# npm
npm install decimal.js

# yarn
yarn add decimal.js

# pnpm
pnpm add decimal.js

基础使用

1. 导入库

javascript 复制代码
// ES6 模块导入
import { Decimal } from 'decimal.js';

// CommonJS 导入
const { Decimal } = require('decimal.js');

// CDN 引入
// <script src="https://cdn.jsdelivr.net/npm/decimal.js@10.4.3/decimal.min.js"></script>

2. 基础示例

javascript 复制代码
// 解决经典的浮点数精度问题
const traditionalWay = 0.1 + 0.2; // 0.30000000000000004
const decimalWay = new Decimal(0.1).plus(0.2); // 0.3

console.log('传统方式:', traditionalWay);
console.log('decimal.js方式:', decimalWay.toString());

// 基础四则运算
const a = new Decimal('123.456');
const b = new Decimal('78.9');

const addition = a.plus(b);        // 加法: 202.356
const subtraction = a.minus(b);    // 减法: 44.556
const multiplication = a.times(b); // 乘法: 9740.8584
const division = a.div(b);         // 除法: 1.5641064524...

console.log('加法结果:', addition.toString());
console.log('减法结果:', subtraction.toString());
console.log('乘法结果:', multiplication.toString());
console.log('除法结果:', division.toFixed(4)); // 保留4位小数

3. 配置选项

javascript 复制代码
// 全局配置
Decimal.set({
  precision: 20,           // 精度设置为20位
  rounding: Decimal.ROUND_HALF_UP, // 四舍五入模式
  toExpNeg: -7,           // 指数表示法的负数阈值
  toExpPos: 21,           // 指数表示法的正数阈值
  maxE: 9e15,             // 最大指数
  minE: -9e15,            // 最小指数
  modulo: Decimal.ROUND_DOWN // 取模运算的舍入模式
});

// 创建具有特定配置的实例
const customDecimal = new Decimal('3.14159265358979323846');
console.log('高精度π值:', customDecimal.toString());

实际应用

应用场景1:金融计算

在金融应用中,精确的数值计算至关重要。让我们看看如何使用decimal.js进行复利计算:

javascript 复制代码
/**
 * 计算复利
 * @param {string|number} principal - 本金
 * @param {string|number} rate - 年利率(小数形式)
 * @param {number} years - 年数
 * @param {number} compoundFreq - 每年复利次数
 * @returns {Decimal} 最终金额
 */
const calculateCompoundInterest = (principal, rate, years, compoundFreq = 12) => {
  const P = new Decimal(principal);
  const r = new Decimal(rate);
  const n = new Decimal(compoundFreq);
  const t = new Decimal(years);
  
  // 复利公式: A = P(1 + r/n)^(nt)
  const ratePerPeriod = r.div(n);
  const onePlusRate = new Decimal(1).plus(ratePerPeriod);
  const exponent = n.times(t);
  const amount = P.times(onePlusRate.pow(exponent));
  
  return amount;
};

// 实际使用示例
const principal = '10000';     // 本金1万元
const annualRate = '0.05';     // 年利率5%
const years = 10;              // 投资10年
const monthlyCompound = 12;    // 月复利

const finalAmount = calculateCompoundInterest(principal, annualRate, years, monthlyCompound);
console.log(`本金: ¥${principal}`);
console.log(`年利率: ${new Decimal(annualRate).times(100)}%`);
console.log(`投资期限: ${years}年`);
console.log(`最终金额: ¥${finalAmount.toFixed(2)}`);
console.log(`总收益: ¥${finalAmount.minus(principal).toFixed(2)}`);

// 贷款月供计算
const calculateMonthlyPayment = (loanAmount, annualRate, years) => {
  const P = new Decimal(loanAmount);
  const r = new Decimal(annualRate).div(12); // 月利率
  const n = new Decimal(years).times(12);    // 总月数
  
  // 月供公式: M = P * [r(1+r)^n] / [(1+r)^n - 1]
  const onePlusR = new Decimal(1).plus(r);
  const numerator = P.times(r).times(onePlusR.pow(n));
  const denominator = onePlusR.pow(n).minus(1);
  
  return numerator.div(denominator);
};

// 房贷计算示例
const loanAmount = '300000';   // 贷款30万
const loanRate = '0.045';      // 年利率4.5%
const loanYears = 30;          // 30年期

const monthlyPayment = calculateMonthlyPayment(loanAmount, loanRate, loanYears);
console.log(`\n房贷计算:`);
console.log(`贷款金额: ¥${loanAmount}`);
console.log(`年利率: ${new Decimal(loanRate).times(100)}%`);
console.log(`贷款期限: ${loanYears}年`);
console.log(`月供: ¥${monthlyPayment.toFixed(2)}`);

应用场景2:电商购物车

在电商系统中,价格计算涉及折扣、税费、运费等多个环节,精确计算非常重要:

javascript 复制代码
/**
 * 购物车类 - 处理复杂的价格计算
 */
class ShoppingCart {
  constructor() {
    this.items = [];
    this.taxRate = new Decimal('0.08'); // 8%税率
    this.shippingFee = new Decimal('9.99'); // 固定运费
  }

  /**
   * 添加商品到购物车
   * @param {Object} item - 商品信息
   */
  addItem = (item) => {
    const cartItem = {
      id: item.id,
      name: item.name,
      price: new Decimal(item.price),
      quantity: new Decimal(item.quantity),
      discount: new Decimal(item.discount || 0)
    };
    this.items.push(cartItem);
  };

  /**
   * 计算商品小计(含折扣)
   * @param {Object} item - 商品项
   * @returns {Decimal} 小计金额
   */
  calculateItemSubtotal = (item) => {
    const subtotal = item.price.times(item.quantity);
    const discountAmount = subtotal.times(item.discount);
    return subtotal.minus(discountAmount);
  };

  /**
   * 计算商品总计
   * @returns {Decimal} 商品总计
   */
  calculateItemsTotal = () => {
    return this.items.reduce((total, item) => {
      return total.plus(this.calculateItemSubtotal(item));
    }, new Decimal(0));
  };

  /**
   * 计算税费
   * @param {Decimal} subtotal - 小计金额
   * @returns {Decimal} 税费
   */
  calculateTax = (subtotal) => {
    return subtotal.times(this.taxRate);
  };

  /**
   * 应用优惠券
   * @param {string|number} couponAmount - 优惠券金额
   * @returns {Decimal} 优惠后总计
   */
  applyCoupon = (couponAmount) => {
    const itemsTotal = this.calculateItemsTotal();
    const tax = this.calculateTax(itemsTotal);
    const totalBeforeCoupon = itemsTotal.plus(tax).plus(this.shippingFee);
    
    const coupon = new Decimal(couponAmount);
    const finalTotal = totalBeforeCoupon.minus(coupon);
    
    return finalTotal.greaterThan(0) ? finalTotal : new Decimal(0);
  };

  /**
   * 获取购物车详细信息
   * @returns {Object} 购物车详情
   */
  getCartSummary = () => {
    const itemsTotal = this.calculateItemsTotal();
    const tax = this.calculateTax(itemsTotal);
    const total = itemsTotal.plus(tax).plus(this.shippingFee);
    
    return {
      items: this.items.map(item => ({
        ...item,
        subtotal: this.calculateItemSubtotal(item),
        price: item.price.toString(),
        quantity: item.quantity.toString(),
        discount: item.discount.toString()
      })),
      itemsTotal: itemsTotal.toString(),
      tax: tax.toString(),
      shippingFee: this.shippingFee.toString(),
      total: total.toString()
    };
  };
}

// 购物车使用示例
const cart = new ShoppingCart();

// 添加商品
cart.addItem({
  id: 1,
  name: 'iPhone 15 Pro',
  price: '999.99',
  quantity: 1,
  discount: '0.05' // 5%折扣
});

cart.addItem({
  id: 2,
  name: 'AirPods Pro',
  price: '249.99',
  quantity: 1,
  discount: '0'
});

cart.addItem({
  id: 3,
  name: '保护壳',
  price: '29.99',
  quantity: 2,
  discount: '0.1' // 10%折扣
});

// 获取购物车摘要
const summary = cart.getCartSummary();
console.log('\n=== 购物车详情 ===');
summary.items.forEach(item => {
  const discountPercent = new Decimal(item.discount).times(100);
  console.log(`${item.name}: $${item.price} × ${item.quantity} = $${item.subtotal} (折扣: ${discountPercent}%)`);
});

console.log(`\n商品小计: $${summary.itemsTotal}`);
console.log(`税费 (8%): $${summary.tax}`);
console.log(`运费: $${summary.shippingFee}`);
console.log(`总计: $${summary.total}`);

// 应用优惠券
const finalTotal = cart.applyCoupon('50');
console.log(`使用 $50 优惠券后: $${finalTotal.toFixed(2)}`);

应用场景3:科学计算

decimal.js也非常适合需要高精度的科学计算:

javascript 复制代码
/**
 * 数学工具类 - 高精度科学计算
 */
class MathUtils {
  /**
   * 计算阶乘
   * @param {number} n - 输入数字
   * @returns {Decimal} 阶乘结果
   */
  static factorial = (n) => {
    if (n < 0) throw new Error('阶乘不支持负数');
    if (n === 0 || n === 1) return new Decimal(1);
    
    let result = new Decimal(1);
    for (let i = 2; i <= n; i++) {
      result = result.times(i);
    }
    return result;
  };

  /**
   * 计算组合数 C(n, r)
   * @param {number} n - 总数
   * @param {number} r - 选择数
   * @returns {Decimal} 组合数
   */
  static combination = (n, r) => {
    if (r > n || r < 0) return new Decimal(0);
    if (r === 0 || r === n) return new Decimal(1);
    
    const numerator = this.factorial(n);
    const denominator = this.factorial(r).times(this.factorial(n - r));
    return numerator.div(denominator);
  };

  /**
   * 计算排列数 P(n, r)
   * @param {number} n - 总数
   * @param {number} r - 选择数
   * @returns {Decimal} 排列数
   */
  static permutation = (n, r) => {
    if (r > n || r < 0) return new Decimal(0);
    if (r === 0) return new Decimal(1);
    
    const numerator = this.factorial(n);
    const denominator = this.factorial(n - r);
    return numerator.div(denominator);
  };

  /**
   * 高精度平方根计算(牛顿法)
   * @param {string|number} x - 输入值
   * @param {number} precision - 精度
   * @returns {Decimal} 平方根
   */
  static sqrt = (x, precision = 50) => {
    const num = new Decimal(x);
    if (num.isNegative()) throw new Error('不能计算负数的平方根');
    if (num.isZero()) return new Decimal(0);
    
    // 设置高精度
    const originalPrecision = Decimal.precision;
    Decimal.set({ precision: precision });
    
    let guess = num.div(2);
    let prevGuess;
    
    do {
      prevGuess = guess;
      guess = guess.plus(num.div(guess)).div(2);
    } while (!guess.equals(prevGuess));
    
    // 恢复原精度
    Decimal.set({ precision: originalPrecision });
    return guess;
  };
}

// 科学计算示例
console.log('\n=== 科学计算示例 ===');

// 阶乘计算
const factorial20 = MathUtils.factorial(20);
console.log(`20! = ${factorial20.toString()}`);

// 组合数计算
const combination = MathUtils.combination(52, 5); // 扑克牌组合
console.log(`C(52,5) = ${combination.toString()}`);

// 排列数计算
const permutation = MathUtils.permutation(10, 3);
console.log(`P(10,3) = ${permutation.toString()}`);

// 高精度平方根
const sqrt2 = MathUtils.sqrt('2', 50);
console.log(`√2 = ${sqrt2.toString()}`);

// 计算圆周率π的近似值(使用莱布尼茨公式)
const calculatePi = (iterations = 1000000) => {
  let pi = new Decimal(0);
  
  for (let i = 0; i < iterations; i++) {
    const term = new Decimal(1).div(2 * i + 1);
    if (i % 2 === 0) {
      pi = pi.plus(term);
    } else {
      pi = pi.minus(term);
    }
  }
  
  return pi.times(4);
};

const piApprox = calculatePi(100000);
console.log(`π ≈ ${piApprox.toString()}`);

优缺点分析

优点 ✅

  • 精度保证:完全解决JavaScript浮点数精度问题,支持任意精度计算
  • 功能完整:提供丰富的数学运算方法,满足各种计算需求
  • 性能优秀:针对常见运算场景进行了优化,性能表现良好
  • 易于使用:API设计直观,学习成本低,文档详细
  • 兼容性好:支持各种环境,无外部依赖
  • 类型安全:提供完整的TypeScript支持

缺点 ❌

  • 包体积:相比原生数值类型,增加了约33KB的体积开销
  • 性能开销:高精度计算比原生浮点数运算慢,不适合大量简单计算
  • 内存占用:Decimal对象比原生数字占用更多内存
  • 学习成本:需要改变现有的数值处理习惯,团队需要统一使用规范

最佳实践

开发建议

1. 性能优化技巧

javascript 复制代码
// 推荐:复用Decimal实例,避免频繁创建
const basePrice = new Decimal('99.99');
const quantities = [1, 2, 3, 4, 5];

const totals = quantities.map(qty => basePrice.times(qty));

// 避免:每次都创建新的Decimal实例
// const totals = quantities.map(qty => new Decimal('99.99').times(qty));

// 推荐:批量计算时使用原生数组方法
const calculateBatchTotal = (prices, quantities) => {
  return prices.reduce((total, price, index) => {
    return total.plus(price.times(quantities[index]));
  }, new Decimal(0));
};

// 推荐:合理设置精度,避免过度精确
Decimal.set({ precision: 20 }); // 通常20位精度足够

// 避免:不必要的高精度设置
// Decimal.set({ precision: 100 }); // 过度精确,影响性能

2. 错误处理策略

javascript 复制代码
/**
 * 安全的除法运算
 * @param {Decimal} dividend - 被除数
 * @param {Decimal} divisor - 除数
 * @returns {Decimal} 结果
 */
const safeDivision = (dividend, divisor) => {
  try {
    if (divisor.isZero()) {
      throw new Error('除数不能为零');
    }
    
    const result = dividend.div(divisor);
    
    // 检查结果是否为有限数
    if (!result.isFinite()) {
      throw new Error('计算结果超出范围');
    }
    
    return result;
  } catch (error) {
    console.error('除法运算错误:', error.message);
    return new Decimal(0); // 返回默认值
  }
};

/**
 * 安全的数值转换
 * @param {any} value - 输入值
 * @returns {Decimal} 转换结果
 */
const safeDecimalConversion = (value) => {
  try {
    const decimal = new Decimal(value);
    
    // 验证转换结果
    if (!decimal.isFinite()) {
      throw new Error('无效的数值');
    }
    
    return decimal;
  } catch (error) {
    console.error('数值转换错误:', error.message);
    return new Decimal(0);
  }
};

3. 内存管理

javascript 复制代码
// 推荐:及时清理不需要的引用
const processLargeDataset = (data) => {
  const results = [];
  
  for (let i = 0; i < data.length; i++) {
    const item = data[i];
    const result = new Decimal(item.value).times(item.multiplier);
    results.push(result.toString()); // 转换为字符串减少内存占用
  }
  
  return results;
};

// 推荐:使用对象池模式(适用于频繁创建销毁的场景)
class DecimalPool {
  constructor(size = 100) {
    this.pool = [];
    this.size = size;
  }
  
  get(value) {
    if (this.pool.length > 0) {
      const decimal = this.pool.pop();
      return decimal.constructor(value);
    }
    return new Decimal(value);
  }
  
  release(decimal) {
    if (this.pool.length < this.size) {
      this.pool.push(decimal);
    }
  }
}

常见陷阱

  • ⚠️ 字符串vs数字:始终使用字符串创建Decimal实例,避免浮点数精度问题
  • ⚠️ 比较运算 :使用.equals().greaterThan()等方法,不要使用===
  • ⚠️ 类型混用:不要将Decimal与原生数字直接运算,先转换类型
  • ⚠️ 精度设置:全局精度设置会影响所有实例,谨慎修改

进阶用法

高级特性

1. 自定义舍入模式

javascript 复制代码
// 设置不同的舍入模式
const value = new Decimal('3.14159');

// 向上舍入
Decimal.set({ rounding: Decimal.ROUND_UP });
console.log('向上舍入:', value.toFixed(2)); // 3.15

// 向下舍入
Decimal.set({ rounding: Decimal.ROUND_DOWN });
console.log('向下舍入:', value.toFixed(2)); // 3.14

// 四舍五入
Decimal.set({ rounding: Decimal.ROUND_HALF_UP });
console.log('四舍五入:', value.toFixed(2)); // 3.14

// 银行家舍入(四舍六入五成双)
Decimal.set({ rounding: Decimal.ROUND_HALF_EVEN });
console.log('银行家舍入:', value.toFixed(2)); // 3.14

2. 格式化输出

javascript 复制代码
/**
 * 数字格式化工具类
 */
class NumberFormatter {
  /**
   * 格式化为货币
   * @param {Decimal} amount - 金额
   * @param {string} currency - 货币符号
   * @returns {string} 格式化结果
   */
  static toCurrency = (amount, currency = '$') => {
    return `${currency}${amount.toFixed(2)}`;
  };

  /**
   * 格式化为百分比
   * @param {Decimal} value - 数值
   * @param {number} decimals - 小数位数
   * @returns {string} 百分比字符串
   */
  static toPercentage = (value, decimals = 2) => {
    return `${value.times(100).toFixed(decimals)}%`;
  };

  /**
   * 格式化大数字(添加千分位分隔符)
   * @param {Decimal} value - 数值
   * @returns {string} 格式化结果
   */
  static toLocaleString = (value) => {
    const str = value.toString();
    return str.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
  };

  /**
   * 科学计数法格式化
   * @param {Decimal} value - 数值
   * @param {number} precision - 精度
   * @returns {string} 科学计数法字符串
   */
  static toExponential = (value, precision = 2) => {
    return value.toExponential(precision);
  };
}

// 格式化示例
const amount = new Decimal('1234567.89');
console.log('\n=== 格式化示例 ===');
console.log('货币格式:', NumberFormatter.toCurrency(amount, '¥'));
console.log('千分位格式:', NumberFormatter.toLocaleString(amount));
console.log('科学计数法:', NumberFormatter.toExponential(amount));

const rate = new Decimal('0.0525');
console.log('百分比格式:', NumberFormatter.toPercentage(rate));

自定义扩展

javascript 复制代码
// 扩展Decimal原型,添加自定义方法
Decimal.prototype.isEven = function() {
  return this.modulo(2).isZero();
};

Decimal.prototype.isOdd = function() {
  return !this.isEven();
};

Decimal.prototype.clamp = function(min, max) {
  if (this.lessThan(min)) return new Decimal(min);
  if (this.greaterThan(max)) return new Decimal(max);
  return this;
};

// 使用自定义方法
const num = new Decimal('42');
console.log('是偶数:', num.isEven()); // true
console.log('是奇数:', num.isOdd());  // false

const value = new Decimal('150');
const clamped = value.clamp(0, 100);
console.log('限制在0-100范围:', clamped.toString()); // 100

工具集成

  • 构建工具:decimal.js支持tree-shaking,可以与Webpack、Vite等现代构建工具无缝集成
  • 测试框架:提供精确的数值比较,非常适合单元测试中的断言
  • 开发工具:支持TypeScript,提供完整的类型提示和错误检查

故障排除

常见问题

Q1: 为什么计算结果与预期不符?

问题描述:使用decimal.js计算后结果仍然不准确

解决方案

javascript 复制代码
// 错误做法:使用浮点数创建Decimal
const wrong = new Decimal(0.1).plus(new Decimal(0.2));

// 正确做法:使用字符串创建Decimal
const correct = new Decimal('0.1').plus(new Decimal('0.2'));
console.log('正确结果:', correct.toString()); // 0.3

Q2: 如何处理除零错误?

问题描述:除法运算可能遇到除零情况

解决方案

javascript 复制代码
const safeDivide = (a, b) => {
  const dividend = new Decimal(a);
  const divisor = new Decimal(b);
  
  if (divisor.isZero()) {
    console.warn('警告:除数为零');
    return new Decimal('Infinity');
  }
  
  return dividend.div(divisor);
};

调试技巧

javascript 复制代码
// 开启调试模式
const debugCalculation = (operation, a, b) => {
  console.log(`计算: ${a} ${operation} ${b}`);
  
  const numA = new Decimal(a);
  const numB = new Decimal(b);
  let result;
  
  switch (operation) {
    case '+':
      result = numA.plus(numB);
      break;
    case '-':
      result = numA.minus(numB);
      break;
    case '*':
      result = numA.times(numB);
      break;
    case '/':
      result = numA.div(numB);
      break;
    default:
      throw new Error('不支持的运算符');
  }
  
  console.log(`结果: ${result.toString()}`);
  console.log(`精度: ${result.precision()}`);
  console.log(`是否有限: ${result.isFinite()}`);
  
  return result;
};

// 使用示例
debugCalculation('+', '0.1', '0.2');

性能问题诊断

  • 检查点1:避免在循环中频繁创建Decimal实例
  • 检查点2:合理设置全局精度,避免过度精确
  • 检查点3:对于简单计算,考虑是否真的需要高精度

总结

decimal.js 是一个功能强大、设计优秀的JavaScript高精度数值计算库,特别适合金融、电商、科学计算等对数值精度要求较高的应用场景。它的高精度计算能力、丰富的API接口、良好的兼容性使其在精确数值计算领域中表现出色。

推荐指数:⭐⭐⭐⭐⭐ (5/5)

适合人群

  • ✅ 金融应用开发者(银行、支付、投资等)
  • ✅ 电商平台开发者(价格计算、订单处理等)
  • ✅ 科学计算应用开发者(数据分析、统计计算等)
  • ✅ 对数值精度有严格要求的项目团队

不适合场景

  • ❌ 对性能要求极高的实时计算场景
  • ❌ 简单的数值运算,精度要求不高的场景
  • ❌ 对包体积非常敏感的轻量级应用

学习建议

  1. 入门阶段:从基础四则运算开始,理解Decimal对象的创建和使用
  2. 进阶阶段:学习配置选项、舍入模式、格式化等高级特性
  3. 实战应用:结合具体业务场景,如金融计算、购物车等进行实践

相关资源


如果你觉得这篇文章对你有帮助,欢迎点赞、收藏和分享。如果你有其他想了解的JavaScript库,也欢迎在评论区留言告诉我!


本文是「掘金周更」系列的第8期,每周为大家推荐一个实用的JavaScript第三方库。关注我,不错过每一期精彩内容!

相关推荐
草莓熊Lotso4 小时前
《C++ Web 自动化测试实战:常用函数全解析与场景化应用指南》
前端·c++·python·dubbo
Tech_Lin4 小时前
JavaScript Date时间对象的常用操作方法总结
前端·javascript
温宇飞4 小时前
JavaScript 异常处理
前端
小岛前端4 小时前
🔥Vue3 移动端组件精选!满足各种场景!
前端·vue.js·微信小程序
用户1510581047434 小时前
带leading和trailing的防抖和节流
前端
IT小哥哥呀4 小时前
论文见解:REACT:在语言模型中协同推理和行动
前端·人工智能·react.js·语言模型
一枚前端小能手4 小时前
🚫 请求取消还在用flag?AbortController让你的异步操作更优雅
前端·javascript
JohnYan4 小时前
工作笔记 - VSCode ssh远程开发
javascript·ssh·visual studio code
code_YuJun4 小时前
前端脚手架开发流程
前端