关于 JavaScript 数组原型
Regarding with JavaScript array prototype
我最近从这个 page 中阅读了与 JavaScript 相关的教程,我尝试了一些代码,但我不明白一些逻辑。下面是作者代码。
函数本身:
var lz="";
lz.memo = function (fn) {
var cache = {};
return function () {
var key = [].join.call(arguments, '§') + '§';
if (key in cache) {
return cache[key]; }
return cache[key] = fn.apply(this, arguments);
};
};
及其执行
var foo = 1;
function bar(baz) {
return baz + foo;
}
var cached = lz.memo(bar);
console.log(cached(1));
foo += 1;
console.log(cached(1)); //2
但如果我改变
var key = [].join.call(arguments, '§') + '§';
到
var key=arguments[0];
它也有效(缓存有效)。作者用这里的目的是什么
var key = [].join.call(arguments, '§') + '§';
感谢关注!这里是CODEPEN of code
it also works (Caching works)
只是因为你只用一个参数调用它。 (而且它的工作方式并不完全相同,缓存键将缺少原始代码所具有的键上的 §
。)
What is the purpose here the author used
他们正在创建一个字符串,其中包含您提供的所有参数,它们之间的 §
和末尾的 §
连接在一起,如下所示:
function foo() {
return [].join.call(arguments, '§') + '§';
}
console.log(foo(1)); // 1§
console.log(foo(1, 2)); // 1§2§
console.log(foo("a", "b", "c")); // a§b§c§
他们这样做是因为 arguments
是 类数组 ,但它不是数组,所以它没有 join
方法来自 Array.prototype
.
他们创建的临时数组其实没有任何原因,直接调用join
即可:
return Array.prototype.join.call(arguments, '§') + '§';
另一个选项是将arguments
转换为实际数组:
return Array.prototype.slice.call(arguments).join('§') + '§';
或在 ES2015 中(或使用 shim):
return Array.from(arguments).join('§') + '§';
我最近从这个 page 中阅读了与 JavaScript 相关的教程,我尝试了一些代码,但我不明白一些逻辑。下面是作者代码。
函数本身:
var lz="";
lz.memo = function (fn) {
var cache = {};
return function () {
var key = [].join.call(arguments, '§') + '§';
if (key in cache) {
return cache[key]; }
return cache[key] = fn.apply(this, arguments);
};
};
及其执行
var foo = 1;
function bar(baz) {
return baz + foo;
}
var cached = lz.memo(bar);
console.log(cached(1));
foo += 1;
console.log(cached(1)); //2
但如果我改变
var key = [].join.call(arguments, '§') + '§';
到
var key=arguments[0];
它也有效(缓存有效)。作者用这里的目的是什么
var key = [].join.call(arguments, '§') + '§';
感谢关注!这里是CODEPEN of code
it also works (Caching works)
只是因为你只用一个参数调用它。 (而且它的工作方式并不完全相同,缓存键将缺少原始代码所具有的键上的 §
。)
What is the purpose here the author used
他们正在创建一个字符串,其中包含您提供的所有参数,它们之间的 §
和末尾的 §
连接在一起,如下所示:
function foo() {
return [].join.call(arguments, '§') + '§';
}
console.log(foo(1)); // 1§
console.log(foo(1, 2)); // 1§2§
console.log(foo("a", "b", "c")); // a§b§c§
他们这样做是因为 arguments
是 类数组 ,但它不是数组,所以它没有 join
方法来自 Array.prototype
.
他们创建的临时数组其实没有任何原因,直接调用join
即可:
return Array.prototype.join.call(arguments, '§') + '§';
另一个选项是将arguments
转换为实际数组:
return Array.prototype.slice.call(arguments).join('§') + '§';
或在 ES2015 中(或使用 shim):
return Array.from(arguments).join('§') + '§';