¿Cómo defino foo para que el siguiente código funcione correctamente como se esperaba (en JavaScript)?
foo[1] + 1 // 2 foo[1][2] + 1 // 4 foo[10][20][30] + 1 // 61 foo[100][200][300] + 1 // 601Esta es una pregunta de entrevista que conocí una vez.
Esto suena como una nueva versión del viejo rompecabezas de función de sum encadenable variable , con acceso de miembro proxy en lugar de llamadas de función. Sin embargo, los posibles enfoques siguen siendo los mismos, y el …+1 revela que están buscando la solución valueOf . Del mismo modo, foo+1 sería 1 y +foo / Number(foo) sería 0 .
const handler = { get(target, propName, receiver) { if (typeof propName == 'string' && /^\d+$/.test(propName)) return sumProxy(target + parseInt(propName, 10)); else return Reflect.get(target, propName, receiver); } }; function sumProxy(value) { return new Proxy({ valueOf() { return value; } }, handler); } const foo = sumProxy(0); console.log(foo + 1); // 1 console.log(foo[1] + 1); // 2 console.log(foo[1][2] + 1); // 4 console.log(foo[10][20][30] + 1); // 61 console.log(foo[100][200][300] + 1); // 601