一道字节的面试题

144 阅读1分钟

题目如下

const r1 = add[1][2] + 3;
const r2 = add[3][4][5] + 6;
console.log(r1) // 输出6
console.log(r2) // 输出18

题目是很好看懂,但是怎么实现它呢,让我们来个思考一下。

首先它是想读add的某个属性,返回之后还可以继续读某个属性。这个时候我们可以使用代理Proxy来实现。

function p(val = 0) {
    return new Proxy({}, {
        get(target, key) {
            return p(val + Number(key))
        }
    })
}

const add = p()
console.log(add[1]);
console.log(add[1][2]);

这样一顿操作,发现打印add[1]add[1][2]没有报错,但是继续后面的加法还是会报错。

image.png

这不就是类型转换出问题了吗,找到问题所在就好解决了。直接上完整代码

function p(val = 0) {
  return new Proxy({}, {
    get(target, key, receiver) {
      if (key === Symbol.toPrimitive) {
        return () => val
      }
      return p(val + Number(key))
    }
  })
}

const add = p()
const r1 = add[1][2] + 3;
const r2 = add[3][4][5] + 6;
console.log(r1) // 输出6
console.log(r2) // 输出18

image.png 控制台打印结果,完美~

延伸阅读,再来一道笔试题,需要在控制台输出OK,看看你会解

if(a == 1 && a == 2 && a == 3) {
  console.log('OK');
}