4、字符串对象
4.1 创建字符串的两种方法
// 字面量
var str = '张三'
// 字符串对象
var strObj = new String('张三')
推荐字面量方法
4.2 字符串的不可变性
字符串的不可变指的是:里面的值不变,虽然看上去可以改变内容,但是其实是地址改变了,内存新中开辟一个内存空间
var str = '张三'
str = '李四'
- 重新给
str赋值的时候,常量“张三” 并不会被修改,依然存在内存中,等待垃圾回收 - 给字符串赋的新值,会重新在内存中开辟新的空间,这个就是字符串的不可变性
- 注意:由于字符串的不可变性,在大量拼接字符串的时候回有效率问题
4.3 根据字符串返回位置
字符串的所有方法,都不会修改字符串本身(因为字符串是不可变的),操作完成后会返回一个新的字符串
| 方法名 | 说明 |
|---|---|
indexOf('要查找的字符', 开始的位置) | 返回指定内容在字符串中的位置,如果找不到就返回-1,开始的位置是index索引号(从0开始) |
lastindexOf() | 从后往前找,只找第一个匹配的 |
indexOf() 和 lastindexOf() 都是只要找到第一个匹配的就退出查找
var str = '我在等某年某月的某一天某人出现'
console.log(str.indexOf('某')); // 3
// 从第4个位置开始查找
console.log(str.indexOf('某', 4)); // 5
// 找不到返回-1
console.log(str.indexOf('你')); // -1
console.log(str.lastIndexOf('某')); // 11
面试题:查找 字符串/数组 中重复字符或元素的个数
- 先找出第一个元素出现的位置
- 只要
indexOf()返回值不等于-1,那就继续找 - 因为
indexOf()只能查找第一个,所以要让其索引号+1,继续找
var str = '我在等某年某月的某一天某人出现'
// 找出第一个字符的位置,以便后面的循环
var index = str.indexOf('某');
var num = 0
while (index != -1) {
num++;
var index = str.indexOf('某', index + 1) // 索引+1,继续查找
}
console.log(num); // 4
4.4 根据位置返回字符(重点)
| 方法名 | 说明 | 使用 |
|---|---|---|
charAt(index) | 返回指定位置的字符(index:索引号) | str.charAt(0) |
charCodeAt(index) | 获取指定位置处字符的ASCII码 (index索引号) | str.charCode(0) |
str[index] | 获取指定位置处字符 | HTML5,IE+ 支持 和charAt() 等效 |
var str = 'AaBbCc'
console.log(str.charAt(0)); // A
console.log(str.charCodeAt(0)); // 65
console.log(str.charCodeAt(1)); // 97
console.log(str[0]); // A
面试题:找出字符串中出现次数最高的字符及次数
- 遍历获取每个字符,存储在对象中,字符为键,次数为值
- 如果该字符存在在对象中,直接令其值+1;否则添加该字符,值为1
- 最后用
for...in方法取出属性,利用属性将属性值进行比较
var str = 'zxczcasdz'
var strObj = {}
for (let i = 0, n = str.length; i < n; i++) {
if (strObj[str.charAt(i)]) {
strObj[str.charAt(i)]++
} else {
strObj[str.charAt(i)] = 1
}
}
var max = 0
var v = ''
for (let k in strObj) {
if (strObj[k] > max) {
max = strObj[k];
v = k
}
}
console.log(v, max); // z 3
4.5 字符串的拼接和截取
| 方法名 | 说明 |
|---|---|
concat(str1, str2 str3...) | concat() 方法用于连续链两个或多个字符串,拼接字符串, 等效于+, 但是 + 更常用 |
substr(start, length) | 从 start 位置开始(索引号),length 取的个数,重点记住这个 |
slice(start, end) | 从 start 位置开始,截取到end位置,end 取不到(它们俩都是索引号) |
substring(strat, end) | 从 start 位置开始,截取到 end 位置, end 取不到 基本和 slice 相同 但是不接受负值 |
拼接
var str1 = '张三'
var str2 = '李四'
console.log(str1.concat(str2)); // 张三李四
截取
var str = '我在等某年某月的某一天某人出现'
// 开始索引,字符个数
console.log(str.substr(3, 4)); // 某年某月
// 开始索引,结束索引(-1 表示倒数第1个)
console.log(str.slice(3, -1)); // 某年某月的某一天某人
console.log(str.substring(3, 7)); // 某年某月
4.6 大小写转换
| 方法名 | 说明 |
|---|---|
toLowerCase() | 将字符串全部转换为小写 |
toUpperCase() | 将字符串全部转换为大写 |
var str = 'ZzXxCc'
console.log(str.toLowerCase()); // zzxxcc
console.log(str.toUpperCase()); // ZZXXCC
4.7 其它操作
| 方法名 | 说明 |
|---|---|
replace('被替换的字符', '替换的字符') | 替换字符,只能替换一个,如果有多个相同字符,则替换第一个 |
split('分隔符') | 将字符串装换为数组,前提是字符串里面的字符得有分隔符 |
trim() | 删除字符串前、后所有空格,在返回字符串 |
替换
// 只能替换第一个
var str = 'aaabbb'
console.log(str.replace('a', 'A')); // Aaabbb
// 替换多个
while (str.indexOf('a') !== -1) {
str = str.replace('a', 'A')
}
console.log(str); // AAAbbb
- 这个可以用于文章替换敏感词
字符串转换为数组
// split('字符串中的分隔符')
var str = 'zxc'
console.log(str.split('')); // [ 'z', 'x', 'c' ]
var str2 = 'z,x,c'; // 字符是用逗号隔开的
console.log(str2.split(',')); // ["z", "x", "c"]
var str3 = 'z x c';
console.log(str3.split(' ')); // ["z", "x", "c"]
split与join相反,join是将数组转换为字符串
去除头尾空白
var str = ' zx c '
console.log(str.trim()); // zx c
只能去除头部和尾部的空白