考虑这段代码,每行末尾有控制台输出:
function whatever() {
console.log(arguments) // { '0': 1, '1': 2, '2': 3, '3': 4, '4': 5 }
console.log(Array.prototype.slice.call(arguments)) // [ 1, 2, 3, 4, 5 ]
console.log(Array.prototype.slice.call({ '0': 1, '1': 2, '2': 3, '3': 4, '4': 5 })) // []
}
whatever(1,2,3,4,5)
为什么第三个console.log
输出一个空数组?
答案 0 :(得分:13)
因为要使Array.prototype.slice
起作用,您需要传递一个类似数组的对象。并且为了使对象适合该类别,它需要length
属性,而您的对象没有该属性。试试这个:
var arr = { '0': 1, '1': 2, '2': 3, '3': 4, '4': 5 };
arr.length = 5;
var res = Array.prototype.slice.call(arr);
console.log(res);
<强> FIDDLE 强>
答案 1 :(得分:2)
正如@basilikum所描述的那样,这是因为.length
是使用.slice()
所必需的。要理解为什么它是必需的,想象一下,在阅读MDN文档之后,您正在编写自己的Array.prototype.slice()
版本:
Array.slice(begin[, end])
<强> begin
强>
开始提取的从零开始的索引。
作为负索引,begin
表示从序列末尾开始的偏移量。 slice(-2)
提取倒数第二个元素和序列中的最后一个元素。
<强> end
强>
基于零的索引,用于结束提取。 slice
提取但不包括end
。
slice(1,4)
通过第四个元素提取第二个元素(元素索引为1,2和3)。
作为负索引,end
表示从序列末尾开始的偏移量。 slice(2,-1)
通过序列中倒数第二个元素提取第三个元素。
如果省略end
,slice
将提取到序列的末尾。
要处理所有这些情况以及一些未列出的情况,您的代码必须是这些内容(这可能有错误但应该关闭):
Array.prototype.myslice = function( begin, end ) {
// Use array length or 0 if missing
var length = this.length || 0;
// Handle missing begin
if( begin === undefined ) begin = 0;
// Handle negative begin, offset from array length
if( begin < 0 ) begin = length + begin;
// But make sure that didn't put it less than 0
if( begin < 0 ) begin = 0;
// Handle missing end or end too long
if( end === undefined || end > length ) end = length;
// Handle negative end (don't have to worry about < 0)
if( end < 0 ) end = length + end;
// Now copy the elements and return resulting array
var result = [];
for( var i = begin; i < end; ++i )
result.push( this[i] );
return result;
};
这就是.slice()
需要this.length
的原因 - 如果没有它,你将无法编写该函数。
答案 2 :(得分:0)
尽我所知
Argument是一个对象类型的变量,我们可以使用它来获取传递给方法的每个参数的条目
例如,如果我们使用此
whatever(a,b,c)
参数将返回0:a ,1:b ,2:c
和slice方法用于将数组从起点切割到终点,如
var myarray=["1","2","3","4"];
myarray.slice(2,3);
将返回3和4,因为它们存在于索引2和3
上所以如果你想在你的参数上使用切片,只需将它定义为slice(startindex,endindex);
只是一个编辑slice.call用于将数组类型转换为另一个数组类型的数据结构,在你的情况下传递参数,因为它是javascript引擎的已知类型,它认为它是一个数组类型并只是转换但是硬编码数组似乎不起作用(只是一个想法)。