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

判断奇偶问题:函数调用与索引访问的实现困惑

问题根源

你写的evenOrOdd是普通函数,evenOrOdd(4)是执行函数逻辑返回结果,但evenOrOdd[4]是取函数对象的属性值——你没给这个函数定义过"4"这类数字属性,所以它返回undefined,测试自然失败。

解决办法

要让一个对象既能当函数调用,又能像数组/对象那样用索引访问,用Proxy是最合理的方案——它能拦截属性访问操作,自动把数字索引转成奇偶判断逻辑。同时你的原函数逻辑可以简化,0本身就是偶数,不用单独写判断:

const evenOrOdd = new Proxy(function(n) {
  return n % 2 === 0 ? 'Even' : 'Odd';
}, {
  get(target, prop) {
    // 把属性名转成整数
    const num = Number(prop);
    // 确认是有效整数的话,执行判断
    if (!isNaN(num) && Number.isInteger(num)) {
      return num % 2 === 0 ? 'Even' : 'Odd';
    }
    // 非数字属性按原函数对象的规则处理
    return target[prop];
  }
});
测试效果

现在这个evenOrOdd两种用法都支持:

  • 函数调用:evenOrOdd(2) → "Even",evenOrOdd(7) → "Odd"
  • 索引访问:evenOrOdd[4] → "Even",evenOrOdd[11] → "Odd"

如果你不想用Proxy,也可以用类来实现,代码稍复杂但逻辑一致:

class EvenOrOdd {
  constructor() {
    return new Proxy(this, {
      // 拦截函数调用
      apply(_, __, [n]) {
        return n % 2 === 0 ? 'Even' : 'Odd';
      },
      // 拦截属性访问
      get(_, prop) {
        const num = Number(prop);
        if (!isNaN(num) && Number.isInteger(num)) {
          return num % 2 === 0 ? 'Even' : 'Odd';
        }
        return undefined;
      }
    });
  }
}

const evenOrOdd = new EvenOrOdd();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 01:33:11