这是我参与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
这里,你可能不能理解,但是当你看到 2n和Symbol.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
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)
"A".repeat(2**29)
最新chrome下,值在 2**28 到 2**29之间。
小结
今天你收获了吗?