You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否需保存getter函数返回值以优化JavaScript代码性能与内存?

从性能角度分析:mixFruits2是否优于mixFruits1?

场景代码

import { mixer } from './kitchen';

type Food = { type: 'fruit'|'vegetable', name: string }

class Fridge {
  food: Food[] = []

  get fruits () { return this.food.filter(f => f.type == 'fruit') }

  mixFruits1 () {
    console.log(`Mixing ${this.fruits.length} together`)
    mixer(this.fruits)
    console.log(`You have mixed ${this.fruits.map(f => f.name).join(', ')} together`)

    // 注意:这个函数里调用了3次this.fruits,每次都是调用getter函数
  }

  mixFruits2 () {
    const fruits = this.fruits
    console.log(`Mixing ${fruits.length} together`)
    mixer(fruits)
    console.log(`You have mixed ${fruits.map(f => f.name).join(', ')} together`)

    // 注意:这个函数只调用一次this.fruits,把结果存在局部变量中复用
  }
}

问题核心

从性能角度分析,mixFruits2是否在技术上优于mixFruits1?因为mixFruits1中三次调用了this.fruits(本质是三次调用getter函数),还是JavaScript内部会自动完成预处理,无需开发者手动缓存返回值?

回答

是的,mixFruits2在性能上确实优于mixFruits1。

原因很直接:this.fruits是一个getter属性,每次访问它都会执行内部的filter方法,对food数组做一次完整的遍历筛选。mixFruits1里连续调用了三次this.fruits,就等于重复做了三次完全相同的数组遍历和筛选操作;而mixFruits2只调用一次getter,把筛选后的结果存在局部变量fruits里,后续所有操作都复用这个变量,只做了一次筛选遍历。

JavaScript引擎不会自动缓存getter的返回值,因为getter本质是一个函数,引擎无法保证每次调用它的返回结果都一致——比如如果在两次调用this.fruits之间,food数组被修改了,getter的返回结果就会不同。所以引擎不会做这种“假设性”的优化,必须由开发者手动缓存重复使用的getter返回值。


内容的提问来源于stack exchange,提问作者vdegenne

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 11:45:45