记住接受Symbol('foo')作为参数

时间:2019-05-21 07:18:55

标签: javascript

我正在尝试实现以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

1 个答案:

答案 0 :(得分:1)

不起作用的原因是符号没有等效的JSON,因此JSON.stringify将为参数数组中的任何符号返回null

一种解决方法是对其应用toString

const stringifiedArgs = JSON.stringify(
    args.map(arg => typeof arg === "symbol" ? arg.toString() : arg)
);

您当然可以将其扩展为其他类型,或者使用支持任何类型的Map作为其键。