# 模板字符串
特性
- 可换行
- 可替换
- 手写模板字符串
# 查找
# indexOf
- 调用:str1.indexOf(str2[, start])
- 入参:String[, Number]
- 返回:str2在str1的下标,没有返回-1,可选定开始位置
let str1 = 'hello world!';
let str2 = 'l';
let str3 = 'z';
console.log(str1.indexOf(str2)); // 2
console.log(str1.indexOf(str3)); // -1
console.log(str1.indexOf(str2, 3)); // 3
console.log(str1.indexOf(str2, 4)); // 9
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# lastIndexOf
- 调用:str1.lastIndexOf(str2[, fromIndex])
- 入参:String[, Number]
- 返回:str2在str1的最后一次出现的下标,没有返回-1,可选定末端开始位置
- tip: 如果fromIndex < 0 ,那么 fromIndex = 0
let str1 = 'hello world!';
let str2 = 'l';
let str3 = 'z';
console.log(str1.lastIndexOf(str2)); // 9
console.log(str1.lastIndexOf(str3)); // -1
console.log(str1.lastIndexOf(str2, 3)); // 3
console.log(str1.lastIndexOf(str2, 5)); // 3
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# match
- 调用:str1.match(reg)
- 入参:RegExp
- 返回:Array | Object
- tip:入参不是RegExp会被隐式 new RegExp(reg)
- tip:返回值类型取决于有没有加 g
let a = 'hello world!';
let b = /l/g;
let c = /l/;
console.log(a.match(b)); // ['l', 'l', 'l']
console.log(a.match(c));
/**
* {
* [0]: 'l',
* index: 2,
* input: 'hello world!',
* group: undefined
* }
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# matchAll
- 调用:str1.matchAll(reg)
- 入参:RegExp
- 返回:iterator,所有的捕获组的一个迭代器
- tip:入参正则必须设置g
let a = 'hello world!';
let b = /l/g;
let c = /l/;
console.log(a.matchAll(b)); // iterator
console.log(a.matchAll(c)); // Error
console.log(Array.from(a.matchAll(b)));
/**
* [
* [ 'l', index: 2, input: 'hello world!', groups: undefined ],
* [ 'l', index: 3, input: 'hello world!', groups: undefined ],
* [ 'l', index: 9, input: 'hello world!', groups: undefined ]
* ]
*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# charAt
- 调用:str.charAt(index)
- 入参:Number
- 返回:String
console.log('hello'.charAt(3)); // l
1
# charCodeAt
- 调用:str.charCodeAt(index)
- 入参:Number
- 返回:Number
console.log('hello'.charCodeAt(3)); // 108
1
# at
- 作用:支持负值下标查找元素
- 调用:str.at(index)
- tip:较新属性,支持环境要求高
环境 | 版本 |
---|---|
node | 16.6.0 |
chrome | 92 |
const str = 'abc';
console.log(str.at(-1)); // c
1
2
2
# search
- 作用:查找字符串的第一个匹配项
- 调用:str.search(reg)
- 传参:RegExp
- 返回:Number
- tip:如果没找到会返回-1
var str = "hey JudE";
var re = /[A-Z]/g;
var re2 = /[.]/g;
console.log(str.search(re)); // 4
console.log(str.search(re2)); // -1
1
2
3
4
5
6
2
3
4
5
6
search和indexof的区别
- search支持正则,但也只能返回第一个匹配项
- indexOf支持变换起始下标,但不支持正则
const str = '1231';
console.log(str.search(/1/, 1)); // 0
console.log(str.indexOf('1', 1)); // 3
1
2
3
2
3
# 判断
# includes
- 调用:str1.includes(str2[, start])
- 入参:String[, Number]
- 返回:bool,str1是否包含str2,可选定开始位置
let str1 = 'hello world!';
let str2 = 'l';
let str3 = 'z';
console.log(str1.includes(str2)); // true
console.log(str1.includes(str3)); // false
console.log(str1.includes(str2, 9)); // true
console.log(str1.includes(str2, 10)); // false
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# endsWith
- 作用:判断字符串是否以指定字符串结尾
- 调用:str1.endsWith(str2[, searchIndex])
- 入参:String[, Number]
- 返回:Boolean
- 最后一个参数是作为第一个字符末尾的index
const str = 'hello world!';
console.log(str.endsWith('hello')); // false
console.log(str.endsWith('hello', 5)); // true
1
2
3
2
3
# strarsWith
startsWith
- 作用:判断字符串是否以指定的字符串开头
- 调用:str.startsWith(str2[, fromIndex])
- 入参:String[, Number]
- 返回:Boolean
# 更改
# concat
- 调用:str1.concat(str2)
- 入参:String [, String...]
- 返回:新的字符串,不改变原字符串
- tip:工作中基本用 + 代替
let str1 = 'hello';
let str2 = ' world!';
console.log(str1.concat(str2)); // hello world!
console.log(str1.concat(str2, str2, str1)); // hello world! world!hello
console.log(str1); // hello
console.log(str1 + str2); // hello world!
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# parseInt
- 调用:parseInt(str)
- 入参:String
- 返回:number
- tip:如果首字符不能转化成数字的会被变成NaN
let a = '1';
let b = '哈111';
console.log(parseInt(a)); // 1
console.log(parseInt(b)); // NaN
1
2
3
4
5
2
3
4
5
# padStart
- 调用:str1.padStart(maxLength, str2)
- 入参:Number, String
- 返回:String,从首部用str2把maxLength填满
- tip:不修改原str1
- tip:长度本来就够就不做修改,不剪裁
- tip:str2不传默认空格 ' '
let a = '21';
let b = '20';
let c = '9';
console.log(a.padStart(4, b)); // 2021
console.log(c.padStart(2, '0')); // 09
console.log('2021年'.padStart(4, '20')); // 2021年 //长度超了,不做修改
console.log(a.padStart(10)); // ' 21'
console.log(a); // 21
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# padEnd
- 调用:str1.padEnd(maxLength, str2)
- 入参:Number, String
- 返回:String,从尾部用str2把maxLength填满
- tip:不修改原str1
- tip:长度本来就够就不做修改,不剪裁
- tip:str2不传默认空格 ' '
console.log('7'.padEnd(3, '0')); // 700
console.log('2021年'.padEnd(2, '0')); // 2021年 //长度超了,不做修改
console.log('1'.padEnd(10)); // '1 '
1
2
3
2
3
# replace
- 作用:替换(一个或全部)指定字符串
- 调用:str1.replace(reg, str2 | (match, $1, $2, ...) => String)
- 入参1:String | RegExp
- 入参2:String | (matchs[, match...], input) => {}
- 返回:String
- tip:不修改原str1
- tip:第一个参数是正则的时候,第二个参数可以是函数,函数入参取决于正则有没有分组
# replaceAll
- 新特性,很多环境还不支持,可在浏览器控制台实验
- 可以直接用replace,正则加 g 就可以实现全部替换
replaceAll
与replace基本一致,只不过会全部替换
- 调用:str1.replaceAll(str2, fn)
- 入参1:String | RegExp
- 入参2:String | (matchs[, match...], input) => {}
- 返回:String,替换了第一个匹配项
- tip:不修改原str1
- tip:第一个参数是正则的时候,第二个参数可以是函数,函数入参取决于正则有没有分组
let a = 'hello world!';
console.log(a.replaceAll('l', 'L')); // heLLo worLd!
let a = 'hello world!';
console.log(a.replace(/l(.*?)w/g, (matchs, match, index, input) => {
/**
* matchs: llo w
* match: 'lo '
* index: 2
* input: hello world!
*/
return 'L'
})); // heLord?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# repeat
- 作用:字符串重复
- 调用:str.repeat(num)
- 入参:Number
- 返回:String
const str1 = 'abc';
console.log(str1.repeat(2)); // abcabc
console.log(str1); // abc
1
2
3
2
3
# trim
- 作用:去掉头尾空格
- 调用:str.trim()
- 返回:String
const str = ' A B C '
console.log(str.trim()); // 'A B C'
1
2
2
# trimStart
- 作用:去掉头空格
- 调用:str.trimStart()
- 返回:String
- 别名:trimLeft
const str = ' A B C ';
console.log(str.trimStart()); // 'A B C '
1
2
2
# trimEnd
- 作用:去掉尾空格
- 调用:str.trimEnd()
- 返回:String
- 别名:trimRight
const str = ' A B C ';
console.log(str.trimEnd()); // ' A B C'
1
2
2
# 切割
# slice
- 调用:str.slice(from[, to])
- 入参:Number[, Number]
- 返回:切割掉的字符串
- tip: slice 可以传负的索引
- tip: 不修改原字符串
let a = 'hello';
console.log(a.slice(2, 4)); // ll
console.log(a.slice(-2, -1)); // l
console.log(a.slice(-1)); // o
console.log(a); // hello
1
2
3
4
5
6
7
2
3
4
5
6
7
# substring
- 调用:str.substring(from, to)
- 入参:Number, Number
- 返回:String
- tip:所有的负数会变成0
let a = 'hello';
console.log(a.substring(1, 2)); // e
console.log(a.substring(-1, 2)); // he
console.log(a.substring(2)); // llo
console.log(a); // hello
1
2
3
4
5
6
2
3
4
5
6
slice和substring区别
- slice支持负数计算,substring直接将负数转换成0
let a = 'hello';
console.log(a.substring(-1, 2)); // he
console.log(a.slice(-1, 2)); // ''
console.log(a.substring(-4, -2)); // ''
console.log(a.slice(-4, -2)); // 'el'
1
2
3
4
5
6
7
2
3
4
5
6
7
# split
- 调用:str.split(str2[, len])
- 入参:String | RegExp[, Number]
- 返回:Array,用str2分割出来的数组,可限制要几个
- tip:第二个参数是限制了数组的长度
- tip:第一个参数可以是正则
# substr
- 调用:str.substr(from[, length])
- 入参:Number[, Number]
- 返回:String
let a = 'hello';
console.log(a.substr(1, 2)); // el
console.log(a.substr(2)); // llo
console.log(a); // hello
1
2
3
4
5
2
3
4
5
# 其他
# Symbol.iterator
- 作用:用字符串转生成可迭代对象
- 调用:str[ Symbol.iterator ] ()
- 返回:Iterator
const str = 'abc';
console.log(str[Symbol.iterator]().next().value); // a
console.log(str); // abc
1
2
3
2
3
# fromCharCode
静态方法
- 作用:将utf-16编码转回字符串
- 调用:String.fromCharCode(code, code...)
- 入参:Number[, Number...]
- 返回:String
- tip:处理的最大编码为FFFF(16进制),要更完善的要用
fromCodePoint
const str = 'abc';
const codeArr = str.split('').map(item => {
let code = item.charCodeAt(0);
return code - 32;
})
console.log(codeArr); // [65, 66, 67]
console.log(String.fromCharCode(...codeArr)); // ABC
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# fromCodePoint
- 作用:支持更大的编码转化成字符串
- 调用:String.charCodePoint(code)
- 入参:Number
- 返回:String
- tip:ES6语法
// 对比
console.log(String.fromCharCode(9731, 9733, 9842, 0x2F804)); // ☃★♲
console.log(String.fromCodePoint(9731, 9733, 9842, 0x2F804)); // ☃★♲你
1
2
3
2
3
# toLowerCase
- 作用:将字符串全部转换成小写
- 调用:str.toLowerCase()
- 返回:String
const str = 'AbCD';
console.log(str.toLowerCase()); // abcd
console.log(str); // AbCD
1
2
3
4
2
3
4
# toUpperCase
- 作用:将字符串全部转换成大写
- 调用:str.toUpperCase()
- 返回:String
const str = 'AbCD';
console.log(str.toUpperCase()); // ABCD
console.log(str); // AbCD
1
2
3
4
2
3
4