每日一题

2 阅读1分钟
function sum(){}
var total = sum();
实现:
total[1][2][3] =6;
total[10][20][30] = 60;
total[20][30][50] = 100;
要适配所有数字,请问这个方法怎么实现

1、当调用sum()之后得到的total对象,可以通过链式的属性访问; 2、最后没有可访问的时候,返回每次访问的对象累加和

每次通过数字访问时,将当前数字累加到一个总和中,并返回一个新对象 该对象同样具有这样的行为,同时保存当前的总和 当该对象被转换为数字时,返回总和的值。 所以 Proxy 合适。 执行total[1][2][3]的结果是一个对象 但在需要得到数值的时候 返回6

在数值运算中,会调用valueOf或者Symbol.toPrimitive方法,这时候返回总和

场景调用的方法
算术运算(+-*valueOfSymbol.toPrimitive
显式转换(Number()valueOfSymbol.toPrimitive
字符串拼接(${obj}toStringSymbol.toPrimitive
非严格相等比较(==valueOfSymbol.toPrimitive
function sum() {
  const handler = {
    get(target, prop, receiver) {
      // 处理原始值转换(如转换为数字或字符串)
      if (prop === Symbol.toPrimitive || prop === 'valueOf') {
        return () => target.sum;
      }
      // 将属性名转换为数值并累加
      const num = Number(prop);
      const newSum = target.sum + num;
      // 返回新的 Proxy 实例以支持链式调用
      return new Proxy({ sum: newSum }, handler);
    }
  };
  // 初始总和为 0 的 Proxy 对象
  return new Proxy({ sum: 0 }, handler);
}

var total = sum();

// 测试用例
console.log(total[1][2][3].valueOf());    // 6
console.log(total[10][20][30].valueOf()); // 60
console.log(total[20][30][50] == 100); // true