js的字符串是不可变的:String 类的所有方法都不允许改变某个字符串的内容。那些像 String.toUpperCase() 之类的方法返回一个全新的字符串,而没有修改原始字符串。
在 ES5 以及之前,字符串的行为类似于每个元素为单个字符的只读数组。
一、字符串 API
1. str.slice(start [,end]) 和 str.substring(start [,end])
截取。
slice() 和 substring() 用法类似,只是slice支持负数,而substring的负数会被转换成0,然后截取0和start之间字符。
如果 substring() 的 start 比 end 大,这个方法将先交换两个参数的值,然后返回它们之间的子串。
2. str.split(delimiter [,limit])
把字符串以分割符为界点分割成数组。
- delimiter:分割处的字符串或正则表达式。
- limit: 指定已返回数组的最大长度。
如果 delimiter 为空字符串或是一个匹配空字符串的正则表达式,则字符串 str 将在每个字符之间断开。
3. str.indexOf(value [,from]) 或 str.lastIndexOf(value [,from])
在指定字符串中寻找一个字符或子串。只查找第一个,找不到返回 -1。
4. str.concat(value)
把value拼接到str上,推荐使用 str + value 代替。
5. str.charAt(index) 和 str[index]
获取指定位置字符。
6. str.trim()
去掉字符串前后空格。
7. str.charCodeAt(index)
指定位置的字符转ASCII码(返回的是一个整数,值在 0~65535 之间,注意不是转成 Unicode)。转成 Unicode 方法请看这里
如果 index 为负数或大于等于字符串的长度,则 charCodeAt() 将返回 NaN。
8. String.fromCharCode(c1, c2, ...)
跟 str.charCodeAt() 相反的操作,把 ASCII码 转成字符串。
String.fromCharCode(104, 101, 108, 108, 111);
9. str.toUpperCase()
转成大写。
10. str.toLowerCase()
转成小写。
11. str.search(regexp)
查找。返回第一个匹配 regexp 的子串的开始位置,如果没找到返回-1。
search() 不执行全局匹配,它会忽略“g”属性,也会忽略 regexp 的 lastIndex 属性,总是从 string 的开始位置开始搜索,这意味着它总是返回第一个匹配子串的位置。
12. string.replace()
替换
str.replace(regexp|string, newString|function)
如果第1个参数是字符串或正则表达式不带 “g” 属性,仅第一个匹配项会被替换。如果 regexp 指定全局属性 “g”,则将替换所有匹配的子串。
1. 如果第2个参数为字符串
字符串中的 $ 字符有特殊含义。就像下表显示的,它表示模式匹配中的一个字符将在替换中使用。
字符 | 替换 |
---|---|
$1, $2, ..., $99 | 匹配第1~99个regexp中的圆括号子表达式的文本 |
$& | 表示匹配到的结果 |
$` | 表示匹配到的结果的左边那一堆字符串 |
$' | 表示匹配到的结果的右边那一堆字符串 |
$$ | 表示$字符 |
"Doe, John".replace(/(\w+)\s*, \s*(\w+)/, "$2 $1"); // "John Doe"
'javascript'.replace(/script/, '$&$&') // javascriptscript
'javascript'.replace(/script/, '$& 不是 $`') // "javascript 不是 java"
'我是猪'.replace(/我是/, "$&$'") // "我是猪猪"
2. 如果第2个参数是函数,该函数的返回值将作为替换文本
str.replace(/elective=(\d*)/g, function(match, $1, $2, offset, string) {})
- match:正则匹配到的完整内容。
- $1:正则第一个分组匹配的内容,以此类推。
- offset:匹配到的字符串在原字符串中的下标(比如,原字符串是 'abcd',匹配到的子字符串是'bc',那么这个参数将会是 1)
- string:被匹配的原字符串
示例:将一个字符串中所有单词的首字母大写
text.replace(/\b\w+\b/g, function(word) {
return word.substring(0, 1).toUpperCase() + word.substring(1);
});
13. string.match(regexp)
返回一个包含匹配结果的数组。数组的内容取决于 regexp 是否设置了 “g” 属性,有 g 跟 没 g 返回结果完全不一致。
例如:
'Abcab'.match(/ab/i)
// ['Ab', index: 0, input: 'Abcab', groups: undefined]
'Abcab'.match(/ab/ig)
// ['Ab', 'ab']
如果 regexp 没有 g 属性,match() 将只在 string 中执行一次匹配,没匹配到返回 null。如果匹配到了,它将返回一个包含它所发现的匹配结果的信息的数组。该数组的第一个元素为匹配的文本,余下的元素则是正则表达式中用圆括号括起来的子表达式相匹配的文本。除此之外,这个数组还有两个额外的对象属性,其中 index 属性指明了匹配文本在 string 中的开始位置;input 属性则是对该 string 本身的引用。
如果 regexp 有 “g” 属性,则 match() 将执行一次全局搜索,在 string 中寻找所有匹配的子串,没匹配到返回 null,如果找到返回一个包含匹配的子串的数组。但是没有 index 和 input 属性,也不会提供关于圆括号子表达式的信息。如果希望在全局搜索时取得这些信息,可以使用 reg.exec()。
14. str1.localeCompare(str2)
字符串比较先后顺序,str1 在 str2 前面返回负数,str1 在 str2 后面返回正数,str1 和 str2 位置相等返回0。
function sortString(arr) {
arr.sort((a, b) => {
return a.localeCompare(b);
})
}
sortString(['bd', 'a', 'aef']); // ['a', 'aef', 'bd']
// 中文好像是按照拼音的字母顺序排序的
sortString(['比', '啊', '次']); // ['啊', '比', '次']