Після довгого і тривалого часу тестування 15 різних функцій / методів, знайдених у цих питаннях, я тепер знаю, який найкращий (найбільш універсальний і швидкий).
Я взяв 15 функцій / методів з відповідей на це питання і склав сценарій для вимірювання часу, необхідного для виконання 100 колодок. Кожен майданчик буде подушечка числа 9
з 2000
нулями. Це може здатися надмірним, і воно є, але це дає хороше уявлення про масштабування функцій.
Код, який я використав, можна знайти тут:
https://gist.github.com/NextToNothing/6325915
Не соромтеся змінювати та тестувати код самостійно.
Для того, щоб отримати найбільш універсальний метод, вам потрібно скористатися петлею. Це тому, що при дуже великій кількості інші, ймовірно, вийдуть з ладу, тоді як це вдасться досягти успіху.
Отже, яку петлю використовувати? Ну, це була б while
петля. for
Цикл по - , як і раніше швидко, але while
петля трохи швидше (кілька мс) - і чистіше.
Відповіді на кшталт тих, які виконали Wilco
, Aleksandar Toplek
або Vitim.us
виконають цю роботу ідеально.
Особисто я спробував інший підхід. Я намагався використовувати рекурсивну функцію для прокладки рядка / числа. Це спрацювало краще, ніж методи приєднання до масиву, але, як і раніше, не працювало так швидко, як цикл for.
Моя функція:
function pad(str, max, padder) {
padder = typeof padder === "undefined" ? "0" : padder;
return str.toString().length < max ? pad(padder.toString() + str, max, padder) : str;
}
Ви можете використовувати мою функцію з або без встановлення змінної padding. Так ось так:
pad(1, 3); // Returns '001'
// - Or -
pad(1, 3, "x"); // Returns 'xx1'
Особисто після моїх тестів я використовував би метод з циклом, наприклад, Aleksandar Toplek
або Vitim.us
. Однак я б трохи змінив його, щоб ви могли встановити рядок прокладки.
Отже, я б використовував цей код:
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'
Ви також можете використовувати його як функцію прототипу, використовуючи цей код:
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'