题目如下
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]没有报错,但是继续后面的加法还是会报错。
这不就是类型转换出问题了吗,找到问题所在就好解决了。直接上完整代码
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
控制台打印结果,完美~
延伸阅读,再来一道笔试题,需要在控制台输出OK,看看你会解
if(a == 1 && a == 2 && a == 3) {
console.log('OK');
}