关于JavaScript数组原型

时间:2016-03-06 11:05:50

标签: javascript arrays join prototype call

我最近从这个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

1 个答案:

答案 0 :(得分:0)

  

它也有效(缓存工作)

只是因为你只用一个参数调用它。 (并且它的工作方式不同,缓存键将丢失原始代码所具有的密钥上的§。)

  

作者使用的目的是什么

他们正在创建一个字符串,其中包含您提供的所有参数以及它们之间的§和最后的§,如下所示:



function foo() {
  return [].join.call(arguments, '§') + '§';
}
snippet.log(foo(1)); // 1§
snippet.log(foo(1, 2)); // 1§2§
snippet.log(foo("a", "b", "c")); // a§b§c§

<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="//tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;

他们正在执行此操作,因为arguments 类似于数组,但它不是一个数组,所以它没有{{来自join的方法。

实际上没有理由他们创建临时数组,你可以直接调用Array.prototype

join

另一个opton是将return Array.prototype.join.call(arguments, '§') + '§'; 转换为实际数组:

arguments

或者在ES2015中(或使用垫片):

return Array.prototype.slice.call(arguments).join('§') + '§';