读老道(Douglas Crockford)的《Javascript:The Good Parts》中关于array.splice()方法的实现代码,现在自己加一些注释。
//array.splice() is a method that delete some items in an array,
//and add new items to the place where the deleted items used
//to be, finally, it returns the deleted items as an array.
Array.method('splice', function (start, deleteCount) {
var max = Math.max,
min = Math.min,
delta,
element,
//arguments here refer to all the arguments this method
//receive(as an array). So we should drop the first two
//paramaters(start and deleteCount).
insertCount = max(arguments.length - 2, 0),
k = 0,
len = this.length,
new_len,
result = [],
shift_count;
//if start is null, start = 0.
start = start || 0;
//if start is a negtive number, add start and len to get the
//index of the start element.
if (start < 0) {
start += len;
}
//make sure that start is no bigger than len nor smaller than 0.
start = max(min(start, len), 0);
//if deleteCount is not given, delete all the elments after start.
//And make sure it is is no bigger than len nor smaller than 0.
deleteCount = max(min(typeof deleteCount === 'number' ?
deleteCount : len, len − start), 0);
delta = insertCount − deleteCount;
new_len = len + delta;
//push this[start,start + deleteCount -1] into result, namely just
//set the deleted array that will be returned.
while (k < deleteCount) {
element = this[start + k];
if (element !== undefined) {
result[k] = element;
}
k += 1;
}
//shift_count is the count of remained elements in this[start,]
shift_count = len - start - deleteCount;
//set the new index of the elements left in this[start,].
if (delta < 0) {
k = start + insertCount;
while (shift_count) {
this[k] = this[k − delta];
k += 1;
shift_count −= 1;
}
this.length = new_len;
} else if (delta > 0) {
k = 1;
while (shift_count) {
this[new_len − k] = this[len − k];
k += 1;
shift_count −= 1;
}
}
//push the added items in the new index-aranged array.
for (k = 0; k < insertCount; k += 1) {
this[start + k] = arguments[k + 2];
//just return the result,nail it!
return result;
});