Skip to content计数为
String.prototype.repeat()
概述
repeat() 方法构造并返回一个新字符串,它将原字符串重复指定次数后拼接在一起。
作为 ES6 新增的字符串实例方法,repeat() 填补了早期规范中字符串重复能力的缺失。调用方无需再借助数组或循环来手动拼接。
基本用法
语法
text
str.repeat(count)count:一个介于0和+∞之间的整数,表示将字符串重复的次数。
返回值
一个新的字符串,由原字符串重复 count 次组成。原字符串自身不会被修改。
异常
RangeError:当count为负数或者Infinity时抛出,因为重复次数无法确定为有限的正数。
示例
基本重复
js
'abc'.repeat(2); // 'abcabc'
'x'.repeat(5); // 'xxxxx'计数为 0
当 count 为 0 时,返回空字符串。
js
'hello'.repeat(0); // ''小数与自动截断
count 值为小数时,会被转换为整数(向下取整)。
js
'ab'.repeat(3.7); // 'ababab'
'ab'.repeat(2.2); // 'abab'需要注意的是,NaN 会被转换为 0,null 和 ''(空字符串)也会被强制转为 0。
js
'na'.repeat(NaN); // ''
'na'.repeat(null); // ''参数为负或无穷大
js
try {
'abc'.repeat(-1);
} catch (e) {
console.log(e); // RangeError: Invalid count value
}
try {
'abc'.repeat(Infinity);
} catch (e) {
console.log(e); // RangeError: Invalid count value
}空字符串自身重复
js
''.repeat(10); // ''工作原理
在 ES6 引入 repeat() 之前,重复字符串的常见写法是利用数组。
js
// ES5 下的常见 polyfill
String.prototype.repeat = function(count) {
if (count < 0 || count === Infinity) {
throw new RangeError('Invalid count value');
}
return new Array(count + 1).join(this);
};这里通过 new Array(count + 1).join(this) 得到重复后的字符串。数组长度为 count + 1,join 时以原字符串作为分隔符,结果就是原字符串重复 count 次。
为什么优先用 join 而不是 += 拼接?在早期的 JavaScript 引擎中,字符串是不可变的,每次 += 都会创建新的中间字符串对象,重复 N 次就会产生 O(N²) 级别的复制开销。而 join 的实现(通常位于底层 C/C++ 代码)可以一次性计算出最终字符串的长度,直接分配所需内存再填充内容,避免了中间对象的反复创建。
现代引擎(如 V8)已经对 += 形式的字符串拼接做了大量优化(例如通过“绳索”结构推迟合并或采取增量扩容策略),因此在小次数或常规开发场景中,性能差异已经远没有以前突出。但在需要生成超大字符串时,预先确定长度、一次性分配内存的思路依然更具确定性。
注意点
- 类型转换:
count会被强制转换为整数。undefined会转为0,但Symbol类型会引发TypeError。 - 结果长度限制:重复生成的字符串长度不能超过引擎所能创建的最大字符串长度(通常接近 (2^{28} - 16) 或更高)。如果超出,同样抛出
RangeError。 - 原字符串不变:与其他字符串方法一致,
repeat()始终返回新字符串,不对原字符串做任何修改。
应用
生成缩进与占位符
js
const indent = ' '.repeat(4);
const line = `${indent}console.log('hello');`;
console.log(line); // ' console.log('hello');'
const separator = '-'.repeat(40);格式化输出
在 CLI 工具或固定宽度的表格中快速补齐空格。
js
const pad = (str, width) => str + ' '.repeat(Math.max(0, width - str.length));
pad('name', 8); // 'name '测试数据构造
js
const bigString = '0123456789'.repeat(1e5); // 100 万字符长度的测试用字符串