字符串 repeat 上

692 阅读3分钟

这是我参与11月更文挑战的第22天,活动详情查看:2021最后一次更文挑战

前言

ECMAScript 6.0 简称ES6 , 是 JavaScript 语言的新一代的标准,于在 2015 年 6 月发布,正式名称就是《ECMAScript 2015 标准》。一般情况,泛指, 5.1版以后的标准,涵盖了 ES2015、ES2016、ES2017、ES2018、ES2019、ES2020、ES2021 等等

我们一起来学习String.prototype.repeat。

String.prototype.repeat

返回一个将原字符串重复count次的新字符串。

语法

str.repeat(count)

参数

  • count

0 和 +Infinity 之间的整数。表示在新构造的字符串中重复了多少遍原字符串。

简单看个例子:

"好人".repeat(2) // 好人好人

这个方法本身都没什么好说的,需要额外说一些的就是这个参数,重复的次数。 MDN上的写的是 0 到 +Infinity

那我们一起看看各种情况吧:

count非数字

"A".repeat("2")     // 'AA'
"A".repeat("a")     // ''
"A".repeat({})      // ''
"A".repeat(null)    // ''
"A".repeat(undefined) // ''
"A".repeat([])   // ''
"A".repeat(true)  // 'A'
"A".repeat(false) // ''
"A".repeat(NaN)   // ''
"A".repeat(2n) 
// Uncaught TypeError: Cannot convert a BigInt value to a number

"A".repeat(Symbol.for("1"))
// VM1276:1 Uncaught TypeError: Cannot convert a Symbol value to a number

这里,你可能不能理解,但是当你看到 2nSymbol.for("1")的时候,应该有答案了。

如果count不是数字,会尝试转换为数字。而且BigInt与Symbol类型是无法转为数字的

无法转为数字和NaN不是一个意思,要注意。

这里先说两个结果, count参数转换结果为0和NaN时,返回的均是 ''

关于非数字转数字,非引用类型(原始值)都好说,引用类型呢?

  • 取原始值
  • 转数字

引用类型取原始值

  • Symbol.toPrimitive
  • valueOf, toString
    一般情况是先valueOf,当有明显表示是要转字符串的时候,是toString优先。 例外Date类型,优先toString。

简单看个例子:

"A".repeat({
    [Symbol.toPrimitive]: () => 1,
    valueOf: () => 2, 
    toString: () => 3
})  
// 'A'

"A".repeat({
    valueOf: () => 2, 
    toString: () => 3
})  
// 'AA'

"A".repeat({
    toString: () => 3
})  
// 'AAA'

这里,可能有人要说了,这里返回的都是数字啊,那我们修改一下。

"A".repeat({
    [Symbol.toPrimitive]: () => NaN,
    valueOf: () => 2, 
    toString: () => 3n
})  
// ''

"A".repeat({
    valueOf: () => '2', 
    toString: () => 3n
})  
// 'AA'

"A".repeat({
    toString: () => 3n
})  
// VM5616:1 Uncaught TypeError: Cannot convert a BigInt value to a number

只有有一个返回原始值,就不会继续往下走。

再看一下特殊的Date:

var d = new Date();
d.valueOf = ()=> 2
d.toString = ()=>3
"A".repeat(d) // "AA";

d == 2  // false
d == 3 // true

这里是不是很神奇。

count为0

返回''

"A".repeat(0)  // ''
"A".repeat(-0) // ''

可以看出, count为0,表示没有重复,那就是啥都没有了,返回空字符串。

cont为NaN

返回''

"A".repeat(NaN)  // ''

count负数

报错,RangeError, Invalid count value。

"A".repeat(-1) 
// Uncaught RangeError: Invalid count value

image.png

count为Infinity

报错,RangeError, Invalid count value。

"A".repeat(Infinity) 

count为小数

等同于 str.repeat(Math.floor(count))。

"A".repeat(2.9)  // "AA"
"A".repeat(2.1)  // "AA"

count的最大值

虽然MDN上写着,最大值是 Infinity。 你以为可以写这么大吗? 不同的浏览器可能有区别,但是都是有限制的。就相当于问题字符串的最大长度值为多少。我不知道确切的值。 可以测试。

chrome 版本 96.0.4664.45(正式版本) (64 位)

"A".repeat(2**28)

image.png

"A".repeat(2**29)

image.png

最新chrome下,值在 2**282**29之间。

小结

今天你收获了吗?