Po długim, długim czasie testowania 15 różnych funkcji / metod znalezionych w odpowiedziach na pytania, teraz wiem, która jest najlepsza (najbardziej wszechstronna i najszybsza).
Z odpowiedzi na to pytanie wziąłem 15 funkcji / metod i stworzyłem skrypt do pomiaru czasu potrzebnego na wykonanie 100 padów. Każdy pad będzie pad numer 9
z 2000
zerami. Może się to wydawać przesadne i jest, ale daje dobre wyobrażenie o skalowaniu funkcji.
Kod, którego użyłem, można znaleźć tutaj:
https://gist.github.com/NextToNothing/6325915
Możesz samodzielnie zmodyfikować i przetestować kod.
Aby uzyskać najbardziej uniwersalną metodę, musisz użyć pętli. Wynika to z faktu, że przy bardzo dużej liczbie inni mogą zawieść, a to się powiedzie.
Której pętli użyć? To byłaby while
pętla. for
Pętla nadal jest szybki, ale while
pętla jest tylko nieznacznie szybciej (kilka ms) - i czystsze.
Odpowiedzi takie jak te Wilco
, Aleksandar Toplek
lub Vitim.us
zrobią to doskonale.
Osobiście próbowałem innego podejścia. Próbowałem użyć funkcji rekurencyjnej do uzupełnienia ciągu / liczby. Działa lepiej niż metody łączące tablicę, ale nadal nie działa tak szybko jak pętla for.
Moja funkcja to:
function pad(str, max, padder) {
padder = typeof padder === "undefined" ? "0" : padder;
return str.toString().length < max ? pad(padder.toString() + str, max, padder) : str;
}
Możesz użyć mojej funkcji z ustawieniem zmiennej dopełniania lub bez niej. Więc tak:
pad(1, 3); // Returns '001'
// - Or -
pad(1, 3, "x"); // Returns 'xx1'
Osobiście po moich testach użyłbym metody z pętlą while, jak Aleksandar Toplek
lub Vitim.us
. Jednak zmodyfikowałbym go nieco, abyś mógł ustawić łańcuch dopełniania.
Więc użyłbym tego kodu:
function padLeft(str, len, pad) {
pad = typeof pad === "undefined" ? "0" : pad + "";
str = str + "";
while(str.length < len) {
str = pad + str;
}
return str;
}
// Usage
padLeft(1, 3); // Returns '001'
// - Or -
padLeft(1, 3, "x"); // Returns 'xx1'
Możesz również użyć go jako funkcji prototypowej, używając tego kodu:
Number.prototype.padLeft = function(len, pad) {
pad = typeof pad === "undefined" ? "0" : pad + "";
var str = this + "";
while(str.length < len) {
str = pad + str;
}
return str;
}
// Usage
var num = 1;
num.padLeft(3); // Returns '001'
// - Or -
num.padLeft(3, "x"); // Returns 'xx1'