Я пишу блок-тесты JavaScript, и мне нужно создать строку длиной 65536. Какой лучший способ сделать это в JavaScript?
В настоящее время я использую:
var myString = '';
for (var i = 0; i <= 65535; ++i) {
myString += 'x';
}
Я пишу блок-тесты JavaScript, и мне нужно создать строку длиной 65536. Какой лучший способ сделать это в JavaScript?
В настоящее время я использую:
var myString = '';
for (var i = 0; i <= 65535; ++i) {
myString += 'x';
}
Как насчет
Array(65537).join('x')
Обратите внимание, что это 65537, а не 65536, потому что вы помещаете символы между ними.
Это прогнозный ответ и не будет работать в текущих реализациях.
В ECMAScript 6 в настоящее время определяется метод String.prototype.repeat. Это позволит вам сделать:
var result = "x".repeat(65535);
Опять же, это будущее дополнение. В настоящее время разрабатывается ECMAScript 6 (Гармония), и это можно технически удалить, хотя это вряд ли возможно.
Текущий проект:
15.5.4.21 String.prototype.repeat(count)
Выполняются следующие шаги:
- Пусть
ObeCheckObjectCoercible(this value).- Пусть
SbeToString(O).ReturnIfAbrupt(S).- Пусть
nявляется результатом вызоваToInteger(count).ReturnIfAbrupt(n).- Если
n < 0, то выведите исключение RangeError.- Если
n-+Infinity, тогда выведите исключение RangeError.- Пусть
Tзначение aString, которое сделано изnкопийS, вместе взятых. Еслиn-0,T- это пустая строка.- Возврат
T.ПРИМЕЧАНИЕ 1. Этот метод создает строку, состоящую из строковых элементов этого объекта (преобразуется в String), повторяется время счета.
ПРИМЕЧАНИЕ 2 Функция повторения намеренно является общей; он не требует, чтобы это значение было объектом String. Поэтому оно может быть передано другим типам объектов для использования в качестве метода.
Array.prototype.join не нужно вызывать в массиве, просто объект с свойством length (проверен в Google Chrome, FireFox, IE10)
function makeStr(len, char) {
return Array.prototype.join.call({length: (len || -1) + 1}, char || 'x');
}
makeStr(5); // "xxxxx"
Это позволяет вам использовать встроенную функцию, создающую строку, без накладных расходов огромного массива.
Из интереса я создал быстрый тестовый тест на jsperf.com:
Конкурсанты
Массив (x).join()
Array.prototype.join, отправленный Полом S.
strRepeat из underscore.string
function strRepeat(str, qty) {
if (qty < 1) return '';
var result = '';
while (qty > 0) {
if (qty & 1) result += str;
qty >>= 1, str += str;
}
return result;
}
strRepeat('*', 20000); Вы можете создать массив длины, что хотите, а затем использовать метод join() в массиве, который превратит его в строку. Array(number).join(char) это создает массив размером number -1. Также обратите внимание, что вы не хотите использовать свой метод, потому что конкатенация строк очень дорога (O (n) каждый concat). Я не уверен, что javascript имеет StringBuilder, например java