关于JavaScript的一个问题';s切片和拼接方法

关于JavaScript的一个问题';s切片和拼接方法,javascript,arrays,slice,splice,arguments,Javascript,Arrays,Slice,Splice,Arguments,我遇到了以下代码: var f = function () { var args = Array.prototype.slice.call(arguments).splice(1); // some more code }; 基本上,args中的结果是一个数组,它是参数的副本,没有第一个元素 但我不能确切理解的是为什么f的参数(这是一个将函数的输入参数保存到类似数组的对象中的对象)对象被传递到slice方法,以及slice(1)如何删除第一个元素(位于索引0处) 谁能给我解

我遇到了以下代码:

var f = function () {
    var args = Array.prototype.slice.call(arguments).splice(1);

    // some more code 
};
基本上,
args
中的结果是一个数组,它是
参数的副本,没有第一个元素

但我不能确切理解的是为什么
f
参数
(这是一个将函数的输入参数保存到类似数组的对象中的对象)对象被传递到
slice
方法,以及
slice(1)
如何删除第一个元素(位于索引0处)

谁能给我解释一下吗

另外,代码来自此


实际代码为:

i、 e“切片”,而不是“拼接”

首先,
slice
方法通常用于:

因此,简单的回答是,代码基本上是模拟的:

arguments.slice(1); // discard 1st argument, gimme the rest
但是你不能直接这么做。数组(可在所有JavaScript函数的执行上下文中使用),虽然它支持通过带有数字键的
[]
运算符进行索引,但实际上不是数组;你不能
。将
推到它上面,
弹出
,或
切片
它,等等

代码实现这一点的方法是通过以下方式“欺骗”
切片
函数(在
参数
对象上同样不可用)在
参数
的上下文中运行:

Array.prototype.slice.call(arguments).splice(1)
完成相同的任务,但对
splice(1)
进行一个无关的调用,该调用从
Array.prototype.slice.call(arguments)
返回的数组中删除元素,从索引
1
开始,一直到数组的末尾<代码>拼接(1)
在IE中不起作用(从技术上讲,它缺少第二个参数,该参数告诉它需要删除多少项IE和ECMAScript)

首先获取
参数的副本
(*),然后从中删除除第一项以外的所有项(以非标准方式),并将要删除的项分配给
参数

生成、修改和丢弃的额外阵列是非常冗余的。最好说 — 正如您链接到的答案中的版本所述:

var args = Array.prototype.slice.call(arguments, 1);
部分函数应用程序也是
function.bind
方法的一个功能,由ECMAScript第五版标准化。在浏览器实现它之前,您可以从页面底部选择一个后备JS本机版本

*:
array.slice()。它必须通过
Array.prototype
显式调用,因为
arguments
不是一个数组,即使它看起来像一个数组,也没有普通的数组方法。这是JavaScript的另一个奇怪错误


你经常看到人们在非数组的对象上使用
数组.prototype
方法;ECMAScript第三版标准特意指出,对于类似于数组的
参数
可以这样做,但是也可以在其他类似于主机对象的数组上这样做,例如NodeList或HTMLCollection。尽管在今天的许多浏览器中,在非数组上调用
Array.prototype
方法可能会成功,但这样做实际上唯一安全的地方是在
参数上,拼接的返回值是已删除元素的数组,
但原始数组(或类似数组的对象)在拼接索引处被截断

使用slice创建副本将保留原始参数数组, 可能是为了以后在函数中使用

在这种情况下,
args=[].slice.call(参数,1)


很抱歉代码有差异,但我复制了粘贴在这里的代码,这是我在这个问题中链接到的答案,但作者同时更改了脚本。再一次,对不起that@Crescent果肉,我改变了我问题中的链接,指向原始的CodeRescent Fresh,在果肉中@安德烈亚斯,是的,我看到了。我相信我的最后一段也提到了
splice(1)
,是吗?有什么东西让我感到不安,我必须把它说出来:
slice()
应该接受一个参数。它在今天的所有浏览器中都是无参数工作的,这就是为什么我在回答中保留了它。但从技术上讲,最后一个示例
Array.prototype.slice.call(arguments)
假定为
Array.prototype.slice.call(arguments,0)
(即将0作为第一个参数传递给slice函数)。如果省略,它基本上默认为0(同样,在所有浏览器中都是如此)。这是我在最近的内存中对代码如何工作的最好的一步一步详细分解。Awesome stuff man,Thank.ES5现在显式地记录了许多Array.prototype方法来处理任何类似于数组的对象,因此应该可以安全地依靠这些方法继续工作。Array.splice(start,deleteCount)实际上删除了元素,重新索引了数组,并更改了其长度。
arguments.slice(1); // discard 1st argument, gimme the rest
Array.prototype.slice // get a reference to the slice method
                      // available on all Arrays, then...
  .call(              // call it, ...
    arguments,        // making "this" point to arguments inside slice, and...
    1                 // pass 1 to slice as the first argument
  )
var args = Array.prototype.slice.call(arguments).splice(1);
var args = Array.prototype.slice.call(arguments, 1);
function handleArguments(){
 var A= [].slice.call(arguments).splice(1);
 //arguments is unchanged
 var s= 'A='+A+'\narguments.length='+arguments.length;

 var B= [].splice.call(arguments, 1);
 // arguments now contains only the first parameter
 s+= '\n\nB='+B+'\narguments.length='+arguments.length;
 return s;
}

// test
alert(handleArguments(1, 2, 3, 4));

returned value:
//var A= [].slice.call(arguments).splice(1);
A=2,3,4
arguments.length=4

//var B= [].splice.call(arguments, 1);
B=2,3,4
arguments.length=1