判断奇偶问题:函数调用与索引访问的实现困惑
问题根源
你写的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
相关产品推荐
相关产品推荐

