Показать сообщение отдельно
  #6 (permalink)  
Старый 13.04.2014, 19:28
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

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;
};

Вроде такая реализация идентична нативной.
Ответить с цитированием