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

`if (key in obj)`与`if (obj[key])`的区别及memo场景性能差异

两行判断语句的核心差异

1. 存在性判断逻辑本质不同

  • 被注释的if (memo[targetSum])实际是判断该key对应的值是否为JS真值,而非判断key是否存在于memo对象中。你的代码逻辑里会把无解的情况存为memo[targetSum] = null,而null属于典型的假值,因此哪怕该key已经被缓存过,只要值是null,这个判断就不会触发,缓存逻辑直接失效。
  • 正确写法的if (targetSum in memo)是直接判断memo对象是否包含该key,和值的类型无关,哪怕值是null、undefined、0等假值,只要key存在就会触发返回,完全符合记忆化缓存的要求。

2. 注释行的返回语句存在语法错误

注释行的返回逻辑写的是memo([targetSum]),相当于把普通对象memo当做函数调用,运行时会直接抛出memo is not a function的报错。哪怕是手误把方括号写成了圆括号,只要判断条件的逻辑问题没有修正,缓存依然不会生效。

性能暴增的根因

注释版写法完全失去了记忆化的作用,所有递归分支都会重复执行:
比如你测试的howSum(300, [7,14])本身没有解,使用in判断的正常版本中,每个计算过的targetSum都会被存为null,后续遇到相同的targetSum会直接返回,时间复杂度为O(n*m)(n为targetSum大小,m为输入数组长度)。
而使用注释版判断的情况下,所有存为null的缓存都不会被命中,程序会把所有可能的递归路径全部执行一遍,时间复杂度退化为指数级的O(m^n),因此耗时会暴涨,看起来就像完全没有检查memo对象。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 18:21:02