Polyfille piszemy nie po to, aby wynaleźć koło od nowa, ale po to, by lepiej zrozumieć zarówno język jak i to, jak często używane funkcje działają. Nie ma lepszego sposobu, aby zapamiętać ich działanie, niż je samemu napisać!

Zobaczmy, jak działa unshift:

const array1 = [1, 2, 3];

console.log(array1.unshift(4, 5));
// Expected output: 5

console.log(array1);
// Expected output: Array [4, 5, 1, 2, 3]

Na początku napiszemy coś, co unshiftem nie jest:

Array.prototype.toUnshifted = function(newEl){
    return [newEl, ...this];
}

let arr123 = [1,2,3];

let newarr = arr123.toUnshifted(0);
console.log(newarr);
//[ 0, 1, 2, 3 ]

Funkcja toUnshifted zwraca nową tablicę z elementem z przodu i resztą elementów dalej. Okej, zróbmy obsługę wielu argumentów:

Array.prototype.toUnshifted = function(...args){
    return [...args, ...this];
}

let arr123 = [1,2,3];

let newarr2 = arr123.toUnshifted(-2, -1, 0);
console.log(newarr2);
//[ -2, -1, 0, 1, 2, 3 ]

Bardzo proste.

Okej, ale unshift jest in-place, on oryginalną tablicę modyfikuje. Oto kod:

Array.prototype.myUnshift = function () {
  if (arguments.length > 0) {
    // move elements of the array ahead
    for (let i = this.length - 1; i >= 0; i--) {
      this[i + arguments.length] = this[i];
    }

    // add the args elements at the start
    for (let i = 0; i < arguments.length; i++) {
      this[i] = arguments[i];
    }
  }

  return this.length;
};

Znalezione w internecie, ale jeden rzut oka powinien już nam wyjaśniać co i jak działa. Arguments to taka zmienna zawierająca wszystkie argumenty przekazane funkcji, czasy przed operatorami rest/spread.

Logika przesuwania też nie jest przesadnie trudna. Zwracamy długość.