JavaScript ES6 String 字符串新增方法
模板字面量
1console.log(`Hello, ${`World`}!`) // Hello, World!
所有插入的值都会使用 toString()强制转型为字符串:
1const foo = { toString: () => 'World' }
2console.log(`Hello, ${foo}!`) // Hello, World!
也可以插入自己之前的值:
1let value = ''
2function append() {
3 value = `${value}abc`
4 console.log(value)
5}
6append() // abc
7append() // abcabc
8append() // abcabcabc
标签函数
1const a = 6
2const b = 9
3function simpleTag(strings, ...expressions) {
4 console.log(strings)
5 for (const expression of expressions)
6 console.log(expression)
7
8 return 'foobar'
9}
10const taggedResult = simpleTag`${a} + ${b} = ${a + b}`
11// ["", " + ", " = ", ""]
12// 6
13// 9
14// 15
15console.log(taggedResult) // "foobar"
标签函数的表达式参数的个数始终是 n,传给标签函数的第一个参数所包含的字符串个数则始终是 n+1。返回正常的字符串结果:
1const a = 6
2const b = 9
3function zipTag(strings, ...expressions) {
4 return strings[0] + expressions.map((e, i) => `${e}${strings[i + 1]}`).join('')
5}
6const untaggedResult = `${a} + ${b} = ${a + b}`
7const taggedResult = zipTag`${a} + ${b} = ${a + b}`
8console.log(untaggedResult) // "6 + 9 = 15"
9console.log(taggedResult) // "6 + 9 = 15"
字符串原始值
1console.log(`\u00A9`) // © 是版权符号
2console.log(String.raw`\u00A9`) // \u00A9
3
4console.log(`first line\nsecond line`) // 换行符示例
5// first line
6// second line
7console.log(String.raw`first line\nsecond line`) // "firstline\nsecond line"
8
9// 实际的换行符不行
10console.log(String.raw`first line
11second line`)
12// first line
13// second line
通过标签函数的第一个参数取得原始值:
1function printRaw(strings) {
2 console.log('字面量:')
3 for (const string of strings)
4 console.log(string)
5
6 console.log('原始值:')
7 for (const rawString of strings.raw)
8 console.log(rawString)
9}
10printRaw`\u00A9${'and'}\n`
11// 字面量:
12// ©
13// (换行符)
14// 原始值:
15// \u00A9
16// \n
识别查找
1// 传入正则会抛出错误
2
3includes() // 返回布尔值,判断是否找到参数字符串。
4startsWith() // 返回布尔值,判断参数字符串是否在原字符串的头部。
5endsWith() // 返回布尔值,判断参数字符串是否在原字符串的尾部。
6
7const string = 'apple,banana,orange'
8string.includes('banana') // true
9string.startsWith('apple') // true
10string.endsWith('apple') // false
11string.startsWith('banana', 6) // true
repeat()
repeat():返回新字符串,将字符串重复指定次数返回。
1'Hello,'.repeat(2) // "Hello,Hello,"
2'Hello,'.repeat(3.2) // "Hello,Hello,Hello," 向下取整
0 至 -1 之间的小数,取整得到 -0 ,等同于 repeat 零次
NaN,等同于 repeat 零次
负数或者 Infinity ,会报错:
1'Hello,'.repeat(-0.5) // ""
2'Hello,'.repeat(Number.NaN) // ""
传入字符串会隐式转换数字
1'Hello,'.repeat('hh') // ""
2'Hello,'.repeat('2') // "Hello,Hello,"
字符串补全
padStart:返回新的字符串,从头部(左侧)补全。
padEnd:返回新的字符串,从尾部(右侧)补全。
1'123'.padStart(10, '0') // "0000000123" 常用于补全位数
2'h'.padStart(5, 'o') // "ooooh"
3'h'.padEnd(5, 'o') // "hoooo"
4'h'.padStart(5) // " h" 没有第二个参数默认空格
5'hello'.padStart(5, 'A') // "hello" 小于或等于返回原字符
6'hello'.padEnd(10, ',world!') // "hello,worl" 截去超出位数
去除空格
trimStart():消除字符串头部的空格 trimEnd():消除尾部的空格
1// 返回的都是新字符串,不会修改原始字符串
2const s = ' abc '
3s.trim() // "abc"
4s.trimStart() // "abc "
5s.trimEnd() // " abc"
:::tip 提示浏览器还部署了额外的两个方法,trimLeft() 是 trimStart() 的别名,trimRight() 是 trimEnd() 的别名。 :::
替换
matchAll():方法返回一个正则表达式在当前字符串的所有匹配
1'aabbcc'.replaceAll('b', '_') // 'aa__cc'
2// 返回一个新字符串,不会改变原字符串。 一次性替换所有匹配。