重写以下javascript代码

时间:2016-05-09 14:26:24

标签: javascript arrays

我正在尝试创建一个模仿Array.prototype.push的函数。 它需要可变数量的参数并将它们推送到特定的数组中。 我已设法使用以下代码执行此操作:

var array=[];
function append(){
    for(var i=0;i<arguments.length;i++)
        array.push(arguments[i]);
}

现在我的问题是:我可以在不使用&#34; for loop&#34;的情况下重写追加功能吗? 提前谢谢。

4 个答案:

答案 0 :(得分:2)

如果需要获取参数数组,则应在参数对象上使用Array的slice函数,并将其转换为标准JavaScript数组:

var array = Array.prototype.slice.call(arguments);

答案 1 :(得分:1)

您可以使用'%d/%m/%Y'

Array.prototype.push.apply

那么,function append(){ // make arguments an array var args = Array.prototype.slice.call(arguments); // return the number of elements pushed in the array return Array.prototype.push.apply(array, args); } 发生了什么?我们使用带有参数的args,目的是使Array.prototype.slice.call成为一个数组,因为它是一个特殊的对象。 arguments用于调用具有特定上下文(也称为Function.prototype.call)的函数,然后使用(逗号分隔)调用函数的参数。方便的是,this看起来slice()上下文的length属性,而this也有一个,当不为空时,具有从0到{{的属性1}},允许arguments在新数组中复制length -1

答案 2 :(得分:0)

你可以在没有for循环的情况下重写它,但你必须使用某种循环(你正在处理多个项目,这是必要的)。

如果您可以访问ES6或Babel,我会使用类似的内容:

function append(...args) {
  return array.concat(args);
}

如果没有ES6,您需要解决arguments不是真正数组的事实。您仍然可以通过Array原型访问它们,将大多数数组方法应用于它。将arguments转换为数组很容易,然后您可以concat这两个:

function append() {
  var args = Array.prototype.map.call(arguments, function (it) {
    return it;
  });
  return array.concat(args);
}

请记住,这些都不会修改全局array,但会返回一个新数组,其中包含可以单独使用或分配回{{{{ 1}}。如果您愿意array,这比尝试使用push更容易,也更健壮。

答案 3 :(得分:0)

实际上我真的相信必须为功能JS重新定义push,因为它的返回值是结果数组的长度,并且它的大部分时间都是无用的。例如,当需要推送一个值并将一个数组作为参数传递给一个函数时,你就无法内联并且事情变得混乱。相反,我希望它返回对它所调用的数组的引用,或者甚至是一个新数组,无论如何我都可以获取长度信息。我的新推文提案如下:

Array.prototype.push = function(...args) {
                         return args.reduce(function(p,c) {
                                              p[p.length] = c;
                                              return p
                                            }, this)
                       };

它返回了对它所调用的数组的完美引用。