麻烦理解memoize实现

时间:2015-06-27 17:45:29

标签: javascript memoization

answerKey [参数]如何工作?如果是Array.prototype.slice.call(参数) 返回一个数组[157,687],将answerKey [parameters]存储为一个数组作为键?

function memoize(mathProblem) {
  var answerKey = {};

  return function(){
    var parameters = Array.prototype.slice.call(arguments);

    if (answerKey[parameters]) {
      console.log('returning cached');
      return answerKey[parameters];
    } else {
      answerKey[parameters] = mathProblem.apply(this, arguments);

      return answerKey[parameters]
    }
  }
};

var multiply = function(a, b){
    return a*b;
}

var memoMultiply = memoize(multiply);

console.log(memoMultiply(157, 687));
=>
107859

console.log(memoMultiply(157, 687))
=>
returning cached
107859

1 个答案:

答案 0 :(得分:4)

方括号表示法会将数组转换为字符串

var answerKey = {};
var params = [157, 687];
answerKey[params] = 107859;
answerKey['157,687']; // 107859

所以是的,关键是数组的内容为字符串。这不是很好的做法。

编辑请求

一般情况下,我会尽量避免依赖于Array.prototype.toString()创建的字符串,因为它有一些奇怪的行为

例如,

。嵌套数组是扁平化的

[2, [3, 4], 5].toString(); // '2,3,4,5'

这会丢失有关源数组的信息,与

无法区分
[2, 3, 4, 5].toString();

为了解决这些问题,我建议通过JSON.stringify();

传递数组
JSON.stringify([2, [3, 4], 5]); // '[2,[3,4],5]'
JSON.stringify([2, 3, 4, 5]); // '[2,3,4,5]'

此示例适用于.toString();,但我认为这是一个坏习惯。