正如@basilikum 所述,这是因为.length
使用.slice()
. 要理解为什么需要它,假设您Array.prototype.slice()
在阅读 MDN 文档后正在编写自己的版本:
句法
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
——没有它你将无法编写函数。