Javascript 难以理解记忆化实现

Javascript 难以理解记忆化实现,javascript,memoization,Javascript,Memoization,answerKey[参数]是如何工作的?if Array.prototype.slice.call(参数) 返回数组[157,687],answerKey[parameters]是否将数组存储为键 function memoize(mathProblem) { var answerKey = {}; return function(){ var parameters = Array.prototype.slice.call(arguments); if (answer

answerKey[参数]是如何工作的?if 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

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

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()传递数组


此示例将使用
.toString()但我认为这是一个坏习惯。

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

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()传递数组


此示例将使用
.toString()但我认为这是一个坏习惯。

不,它将数组字符串化以将其用作属性name@Bergi它不会字符串化它调用的数组。toString()@TomDDD:这就是我所说的“字符串化”。应该说“casts to a string”。@Bergi我只是澄清了很多时间
stringify
的意思是
JSON。stringify
产生了一个不同的字符串。不,它将数组字符串化以将其用作属性name@Bergi它不会字符串化它调用的数组。toString()@TomDDD:这就是我所说的“字符串化”。应该说“强制转换为字符串”。@Bergi我只是澄清了很多时间
stringify
的意思是
JSON。stringify
产生了一个不同的字符串。“这不是很好的实践”-为什么不?有什么更好的方法吗?array.toString()有时会有奇怪的行为,以后会咬你。考虑这个<代码> [ 2,[ 3, 4 ],5 ]。code>这将生成字符串
'2,3,4,5'
@Bergi。在本例中,当记忆两个数字时,可以使用该字符串。考虑将数组直接存储在<代码> JSON.StrugI化(PARAMS)中;code>这将生成一个看起来像实际数组的字符串,并且不会将其展平
[157,687]
好吧,考虑到
mathproblem
听起来像是一个只将普通数字,而不是任何数组作为参数的函数,这似乎很好。但我明白你的意思了,我很想在你的回答中看到这一点。“这不是很好的练习”-为什么不呢?有什么更好的方法吗?array.toString()有时会有奇怪的行为,以后会咬你。考虑这个<代码> [ 2,[ 3, 4 ],5 ]。code>这将生成字符串
'2,3,4,5'
@Bergi。在本例中,当记忆两个数字时,可以使用该字符串。考虑将数组直接存储在<代码> JSON.StrugI化(PARAMS)中;code>这将生成一个看起来像实际数组的字符串,并且不会将其展平
[157,687]
好吧,考虑到
mathproblem
听起来像是一个只将普通数字,而不是任何数组作为参数的函数,这似乎很好。但我明白你的意思,我很想在你的回答中看到这一点。