麻烦理解memoize实现

问题描述:

answerKey [参数]如何工作?如果Array.prototype.slice.call(参数) 返回一个数组[157,687],是answerKey [parameters]将数组存储为key?麻烦理解memoize实现

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 
+0

不,它将数组字符串化为使用它作为属性名称 – Bergi

+0

@Bergi它不会将其调用的数组串起来.toString() – t3dodson

+0

@TomDDD:这就是我所说的“字符串化”。应该说“铸造成一个字符串”。 – Bergi

的方括号将阵列转换成一个字符串

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();一起工作,但我认为它是一个坏习惯。

+0

“*这不是很好的做法*” - 为什么不呢?什么是更好的方法? – Bergi

+0

数组.toString()有时会有奇怪的行为,并会在稍后咬你。考虑这个'[2,[3,4],5] .toString();'这会产生字符串'2,3,4,5'' – t3dodson

+2

@Bergi这可能是正确的在这种情况下使用时,记忆两数字。考虑不是直接将数组存储在'JSON.stringify(params);'这将产生一个看起来像实际数组的字符串,并且不会将其压扁[157,687]' – t3dodson