麻烦理解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
答
的方括号将阵列转换成一个字符串
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();
一起工作,但我认为它是一个坏习惯。
不,它将数组字符串化为使用它作为属性名称 – Bergi
@Bergi它不会将其调用的数组串起来.toString() – t3dodson
@TomDDD:这就是我所说的“字符串化”。应该说“铸造成一个字符串”。 – Bergi