我正在尝试实现以Symbol()作为参数的Memoize函数。有没有办法将Symbol('foo')添加为参数?
let obj = {};
let counter = 1;
function foo() {
counter += 1;
return counter;
}
function memoize(fn) {
const cache = {};
return (...args) => {
const stringifiedArgs = JSON.stringify(args);
const result = (cache[stringifiedArgs] = !cache.hasOwnProperty(
stringifiedArgs
)
? fn(...args)
: cache[stringifiedArgs]);
return result;
};
}
let id = Symbol('id');
const memoizedFoo = memoize(foo);
console.log(memoizedFoo(id)); // 2
console.log(memoizedFoo(null)); // 2
console.log(memoizedFoo(id)); // 2
console.log(memoizedFoo(null)); //2
console.log(memoizedFoo(5)); // 3
console.log(memoizedFoo(5)); // 3
console.log(memoizedFoo(obj)); // 4
console.log(memoizedFoo(obj)); // 4
console.log(memoizedFoo(4)); // 5
答案 0 :(得分:1)
不起作用的原因是符号没有等效的JSON,因此JSON.stringify
将为参数数组中的任何符号返回null
。
一种解决方法是对其应用toString
:
const stringifiedArgs = JSON.stringify(
args.map(arg => typeof arg === "symbol" ? arg.toString() : arg)
);
您当然可以将其扩展为其他类型,或者使用支持任何类型的Map
作为其键。