关于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