2015-06-27 109 views
1

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

回答

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();一起工作,但我認爲它是一個壞習慣。

+0

「*這不是很好的做法*」 - 爲什麼不呢?什麼是更好的方法? – Bergi

+0

數組.toString()有時會有奇怪的行爲,並會在稍後咬你。考慮這個'[2,[3,4],5] .toString();'這會產生字符串'2,3,4,5'' – t3dodson

+2

@Bergi這可能是正確的在這種情況下使用時,記憶兩數字。考慮不是直接將數組存儲在'JSON.stringify(params);'這將產生一個看起來像實際數組的字符串,並且不會將其壓扁[157,687]' – t3dodson