我正在尝试创建一个模仿Array.prototype.push的函数。 它需要可变数量的参数并将它们推送到特定的数组中。 我已设法使用以下代码执行此操作:
var array=[];
function append(){
for(var i=0;i<arguments.length;i++)
array.push(arguments[i]);
}
现在我的问题是:我可以在不使用&#34; for loop&#34;的情况下重写追加功能吗? 提前谢谢。
答案 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)
};
它返回了对它所调用的数组的完美引用。