字符串属于Javascript中基本数据类型的一种。用于表示由0个或多个16位Unicode字符组成的字符序列
字符串可以用双引号包裹,也可以用单引号包裹。但是注意一定要左右两边都是双引号或单引号。
字符串通常使用字面量表示即可,例如:
const str = 'Hello Gary'
此时就声明了一个字符串。
一些特殊的字面量
可以通过转义字符 \反斜杠 来表示一些特殊的字面量
\n | 换行 |
---|---|
\t | 水平制表符 |
\b | 空格 |
\r | 回车 |
\f | 换页 |
\\ | 表示一个反斜杠\ |
’ | 表示一个单引号,在单引号包裹的字符串中使用,避免字符串提前结束 |
" | 表示一个双引号 |
\xnn | 表示16进制码nn代表的一个字符(n的范围0-F)。例如 \x41表示“A” |
\unnnn | 表示16进制码nnnn代表的一个Unicode字符(n的范围0-F)。例如\u03a3表示希腊字符Σ |
字符串的长的可以通过其length属性访问,返回该字符串包含的16位字符的数目
console.log('Gary lalala'.length) //11 空格会算在里面
字符串常用操作
indexOf()方法
返回调用它的字符串的第一次出现指定值的索引,区分大小写
语法:
str.indexOf(searchVal , [, fromIndex])
接收两个参数:
1、searchVal 要查找的字符串,如果不传,默认是‘undefined’
2、fromIndex 数字下标,即从字符串指定位置开始查找,默认值是0,即从下标0出开始查找,可不传
返回值:
返回查找的字符串第一次出现的索引,如果没有找到,则返回-1
'Gary lalala'.indexOf('la') //返回5
'Gary lalala'.indexOf('la',6) //返回7
'Gary lalala'.indexOf('lay') //返回-1
'Gary lalala'.indexOf('Gary') //返回0
'Gary lalala'.indexOf('gary') //返回false
注意: 返回0同样表示字符串包含searchVal,但不是true,因此进行判断时
'Gary lalala'.indexOf('Gary') !== -1 //这样更准确
!!'Gary lalala'.indexOf('Gary') //false
lastIndexOf()方法
类似indexOf()方法,只不过是从str.length-1处,从后向前找,其余都相同
使用indexOf统计一个字符串中某个字母出现的次数
const str = 'Stupid is as stupid does';
let count = 0;
let pos = str.indexOf('s');
while (pos !== -1) {
count++;
pos = str.indexOf('s', pos + 1);
}
console.log(count); //4
charAt()方法
语法:
str.charAt(index)
用于根据指定下标返回字符串中指定字符,效果同str[index]
参数:
index 范围:0到str.length-1,如果不传,默认为0,如果传入的值大于str.length-1,则返回一个空字符串
const str = 'Hello'
str.charAt(1) // 'e'
str.chatAt() str.charAt(0) //'H'
str.charAt(5) // ''
includes()方法
语法:
str.includes(searchString[, position])
参数:
searchString 要在此字符串中搜索的字符串
position 可不传,表示从当前字符串的那个索引位置开始搜索字符串,默认为0
用于判断一个字符串中是否包含指定字符串,返回的是布尔值,该方法同样区分大小写
'Gary lalala'.includes('Gary') //true
endsWith()方法
语法:
str.endsWith(searchString[, length])
参数:
searchString 要搜索的子字符串
length 作为str的长度,可不传,默认值为str.length
作用:判断str是不是以传入的子字符串结尾,返回值是一个布尔值,同样区分大小写。
const str = 'Life was like a box of chocolates'
console.log(str.endsWith('chocolates')) //true
console.log(str.endsWith('es')) //true
console.log(str.endsWith('was')) //false
console.log(str.endsWith('was',8)) //true
match()方法
语法:
str.match(regexp)
参数:
regexp 一个正则表达式。 如果传入一个非正则表达式对象,则会隐式地使用 new RegExp(obj)
将其转换为一个 正则表达式 。如果没有传递参数而直接使用match,会得到一 个包含空字符串的 数组:[""] 。
返回值:
如果参数使用了g标志,则返回与完整正则表达式匹配的所有结果,不会返回捕获组
如果未使用g标志,则返回第一个完整匹配及其相关的捕获组,且返回的数组具有以下属性:
groups: 一个捕获数组或undefined(如果没有定义命名捕获组)
index:匹配结果的开始位置
input:搜索的字符串
一个数组,内用取决于传入的正则表达式g标志是否存在,如果未匹配到结果则返回null
例: 使用 match
查找 “Chapter
” 紧跟着 1 个或多个数值字符,再紧跟着一个小数点和数值字符 0 次或多次。正则表达式包含 i
标志,因此大小写会被忽略。
var str = 'For more information, see Chapter 3.4.5.1';
var re = /see (chapter \d+(\.\d)*)/i;
var found = str.match(re);
console.log(found);
// 'see Chapter 3.4.5.1' 是整个匹配。
// 'Chapter 3.4.5.1' 被'(chapter \d+(\.\d)*)'捕获。
// '.1' 是被'(\.\d)'捕获的最后一个值。
// 'index' 属性(22) 是整个匹配从零开始的索引。
// 'input' 属性是被解析的原始字符串。
使用g和i标志:
var str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
var regexp = /[A-E]/gi;
var matches_array = str.match(regexp);
console.log(matches_array);
//["A", "B", "C", "D", "E", "a", "b", "c", "d", "e"]
repeat()方法
语法:
str.repeat(count)
参数:
count 介于0到 +Infinity之间的整数, 表示在新构造的字符串中重复了多少遍原字符串。
返回值:
包含指定字符串的指定数量副本的新字符串。
"abc".repeat(-1) // RangeError: repeat count must be positive and less than inifinity
"abc".repeat(0) // ""
"abc".repeat(1) // "abc"
"abc".repeat(2) // "abcabc"
"abc".repeat(3.5) // "abcabcabc" 参数count将会被自动转换成整数.
"abc".repeat(1/0) // RangeError: repeat count must be positive and less than inifinity
replace()方法
replace()
方法返回一个由替换值(replacement
)替换部分或所有的模式(pattern
)匹配项后的新字符串。模式可以是一个字符串或者一个正则表达式,替换值可以是一个字符串或者一个每次匹配都要调用的回调函数。如果pattern
是字符串,则仅替换第一个匹配项。
语法:
str.replace(regexp|substr , newSubStr|funciton)
参数:
正则表达式(pattern) 该正则匹配到的内容会被第二个参数的返回值替换掉
字符串(pattern) 一个将被newSubStr替换掉的字符串,只有第一个匹配项会被替换掉
新的字符串(replacement) 新的字符串,用于替换原字符串中匹配到的内容。该字符串中可以插入一些特殊的变量名,见下表
回调函数(replacement)一个用来创建新字符串的函数,该函数的返回值将会替换掉第一个匹配到的结果
替换字符可以插入的特殊变量名
变量名 | 代表的值 |
---|---|
$$ | 插入一个 “$”。 |
$& | 插入匹配的子串。 |
$` | 插入当前匹配的子串左边的内容 |
$’ | 插入当前匹配的子串右边的内容。 |
$n | 假如第一个参数是 RegExp 对象,并且 n 是个小于100的非负整数,那么插入第 n 个括号匹配的字符串。提示:索引是从1开始。如果不存在第 n个分组,那么将会把匹配到到内容替换为字面量。比如不存在第3个分组,就会用“$3”替换匹配到的内容。 |
$ | 这里*Name * 是一个分组名称。如果在正则表达式中并不存在分组(或者没有匹配),这个变量将被处理为空字符串。只有在支持命名分组捕获的浏览器中才能使用。 |
当替换值是一个函数时
当匹配执行后,该函数就会执行。 函数的返回值作为替换字符串。 (注意:上面提到的特殊替换参数在这里不能被使用。) 另外要注意的是,如果第一个参数是正则表达式,并且其为全局匹配模式,那么这个方法将被多次调用,每次匹配都会被调用。
以下是该函数的参数:
变量名 | 代表的值 |
---|---|
match | 匹配的子串。(对应于上述的$&。) |
p1,p2, … | 假如replace()方法的第一个参数是一个RegExp 对象,则代表第n个括号匹配的字符串。(对应于上述的$1,$2等。)例如,如果是用 /(\a+)(\b+)/ 这个来匹配,p1 就是匹配的 \a+ ,p2 就是匹配的 \b+ 。 |
offset | 匹配到的子字符串在原字符串中的偏移量。(比如,如果原字符串是 'abcd' ,匹配到的子字符串是 'bc' ,那么这个参数将会是 1) |
tring | 匹配的原字符串。 |
NamedCaptureGroup | 命名捕获组匹配的对象 |
例:
function replacer(match, p1, p2, p3, offset, string) {
// p1 is nondigits, p2 digits, and p3 non-alphanumerics
return [p1, p2, p3].join(' - ');
}
var newString = 'abc12345#$*%'.replace(/([^\d]*)(\d*)([^\w]*)/, replacer);
console.log(newString); // abc - 12345 - #$*%
在replace()中使用正则表达式:
const str = 'Balabala';
const newStr = str.replace(/ba/gi , 'CA');
console.log(newStr) //'CAlaCAla'
交换字符串中的两个单词:
var re = /(\w+)\s(\w+)/;
var str = "John Smith";
var newstr = str.replace(re, "$2, $1");
console.log(newstr); // Smith, John
search()方法
语法:
str.search(regexp)
参数:
一个正则表达式。如果传入的参数不是正则表达式,会使用new Regexp(regexp)隐式将其转为正则表达式
返回值:
如果匹配成功,则返回正则表达式在字符串中首次匹配项的索引,否则返回-1
例:
var str = "hey JudE";
var re = /[A-Z]/g;
var re2 = /[.]/g;
console.log(str.search(re)); // returns 4 匹配到'J'
console.log(str.search(re2)); // returns -1
slice()方法
语法:
str.slice(beginIndex[, endIndex]);
参数:
beginIndex 传入一个数字,表示从原始字符串的改下标处开始提取。如果传入负数,则会经过str.length+该负数处理
endIndex 到该下标处结束提取字符串。如果不传,则默认提取到字符串最后一位。同样的如果传入负数,则会经过str.length+该负数处理
返回值:
返回一个从原字符串提取出来的新字符串,不改变原字符串
例:
var str1 = 'The morning is upon us.', // str1 的length是23。
str2 = str1.slice(1, 8),
str3 = str1.slice(4, -2),
str4 = str1.slice(12),
str5 = str1.slice(30);
console.log(str2); // 输出:he morn
console.log(str3); // 输出:morning is upon u
console.log(str4); // 输出:is upon us.
console.log(str5); // 输出:""
传入负值:
var str = 'The morning is upon us.';
str.slice(-3); // 返回 'us.'
str.slice(-3, -1); // 返回 'us'
str.slice(0, -1); // 返回 'The morning is upon us'
split()方法
语法
str.split([separator[, limit]])
参数:
separator 以该参数作为拆分字符串标准,可以是一个字符串或正则表达式。如果是一个空字符串,则将str原字符串中的每个字符以数组形式返回
limit 一个整数,限定分割片段数量,表示数组中最多能放几项,大于limit的内容会被忽略
返回值:
返回原字符串以分隔符出现位置分割而成的一个数组
例:
const str = 'lalalalal';
const sArr = str.split('a');
const sArr1 = str.split('a',3);
console.log(sArr); //["l", "l", "l", "l", "l"]
console.log(sArr1) //["l", "l", "l"]
移除字符串中的空格:
split()
方法会查找“0 或多个空白符接着的分号,再接着 0 或多个空白符”模式的字符串,找到后,就将空白符从字符串中移除,nameList
是 split
的返回数组
var names = "Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand ";
var re = /\s*(?:;|$)\s*/;
var nameList = names.split(re);
console.log(nameList); //["Harry Trump", "Fred Barney", "Helen Rigby", "Bill Abel", "Chris Hand", ""]
限定返回值来分割元素数量
var myString = "Hello World. How are you doing?";
var splits = myString.split(" ", 3); //以空格分割原数组
console.log(splits); //["Hello", "World.", "How"]
字符串反转
const str = 'abcdef';
const strReverse = str.split('').reverse().join('');
console.log(strReverse) //'fedcba'
substr()方法
语法:
str.substr(start[,length])
参数:
start 开始提取字符的位置。如果传入负数,则会经过str.length + start处理,如果处理后的值为负数,则从小标0处开始截取
length 可不传,提取的字符串长度。如果为0或负数,则返回一个空字符串。不传默认截取到字符串结束
返回一个字符串中从指定位置开始截取指定字符数的字符串
例:
const str = 'abcdefg'
console.log(str.substr(0)) //'abcdefg'
console.log(str.substr(1,3)) // 'bcd'
console.log(str.substr(-3 , 2)) // 'ef'
console.log(str.substr(-30 , 2)) // 'ab'
substring()方法
语法:
str.substring(startIndex[, endIndex])
参数:
startIndex 需要截取的第一个字符的索引,从该位置开始(包含该位置)截取字符串
endIndex 可选,0到字符串长度之间的整数,截取的字符串不包含改下标字符
包前不包后
返回值:
返回一个包含给定字符串的指定部分的新字符串
注意:
如果startIndex 等于 endIndex 则返回空字符串
如果不传endIndex,则一直截取到字符串结束位置
任意一项小于0或为NaN,都会被认为是0
任一项大于str.length,都被认为是str.length
如果startIndex > endIndex 则会将两个参数替换
例:
var anyString = "Mozilla";
// 输出 "Moz"
console.log(anyString.substring(0,3));
console.log(anyString.substring(3,0));
console.log(anyString.substring(3,-3));
console.log(anyString.substring(3,NaN));
console.log(anyString.substring(-2,3));
console.log(anyString.substring(NaN,3));
// 输出 "lla"
console.log(anyString.substring(4,7));
console.log(anyString.substring(7,4));
// 输出 ""
console.log(anyString.substring(4,4));
// 输出 "Mozill"
console.log(anyString.substring(0,6));
// 输出 "Mozilla"
console.log(anyString.substring(0,7));
console.log(anyString.substring(0,10));
结合字符串长度使用:
var anyString = 'Mozilla';
var anyString4 = anyString.substring(anyString.length - 4);
console.log(anyString4); // 'illa'
var anyString = 'Mozilla';
var anyString5 = anyString.substring(anyString.length - 5);
console.log(anyString5); //'zilla'
替换一个字符串的子字符串
function replaceString(oldS, newS, fullS) {
// Replaces oldS with newS in the string fullS
for (var i = 0; i < fullS.length; i++) {
if (fullS.substring(i, i + oldS.length) == oldS) {
fullS = fullS.substring(0, i) + newS + fullS.substring(i + oldS.length, fullS.length);
}
}
return fullS;
}
replaceString("World", "Web", "Brave New World");
toLowerCase()方法
语法:
str.toLowerCase()
返回一个全部是小写字母的新字符串
const str = 'ABCdef';
const lowStr = str.toLowerCase();
console.log(lowStr) //'abcdef'
toUpperCase()方法
语法:
str.toUpperCase()
返回一个全部是大写字母的新字符串
const str = 'ABCdef';
const lowStr = str.toLowerCase();
console.log(lowStr) // 'ABCDEF'
trim()方法
语法:
str.trim()
从一个字符串的两端删除空白字符。在这个上下文中的空白字符是所有的空白字符 (space, tab, no-break space 等) 以及所有行终止符字符(如 LF,CR等)
返回一个原字符串两端去掉空白的新字符串
var orig = ' foo ';
console.log(orig.trim()); // 'foo'
var orig = 'foo ';
console.log(orig.trim()); // 'foo'
在不支持trim()的环境中兼容
if (!String.prototype.trim) {
String.prototype.trim = function () {
return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
};
}