NuclleaR, в твоём варианте есть несоответствие нативному методу:
var array = [,,];
array.splice(0, 1);
0 in array; // должно быть false, у тебя - true
А используя метод
.slice, можно избавиться от циклов и значительно сократить код. Я бы сделал так:
Array.prototype.splice = function (start, deleteCount) {
if (start < 0) start += this.length;
if (start > this.length) start = this.length;
var removed = this.slice(start, start + deleteCount);
var tail = this.slice.call(arguments, 2).concat(this.slice(start + deleteCount));
this.length = start + tail.length;
for(var i = 0; i < tail.length; i++) {
if (i in tail) this[start + i] = tail[i];
else delete this[start + i];
}
return removed;
};
Вроде такая реализация идентична нативной.