js:这就是字符串对象

257 阅读4分钟

4、字符串对象

4.1 创建字符串的两种方法

// 字面量
var str = '张三'

// 字符串对象
var strObj = new String('张三')

推荐字面量方法

4.2 字符串的不可变性

字符串的不可变指的是:里面的值不变,虽然看上去可以改变内容,但是其实是地址改变了,内存新中开辟一个内存空间

var str = '张三'
str = '李四'
  • 重新给str赋值的时候,常量“张三” 并不会被修改,依然存在内存中,等待垃圾回收
  • 给字符串赋的新值,会重新在内存中开辟新的空间,这个就是字符串的不可变性
  • 注意:由于字符串的不可变性,在大量拼接字符串的时候回有效率问题

20210410111135.png

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

面试题:查找 字符串/数组 中重复字符或元素的个数

  1. 先找出第一个元素出现的位置
  2. 只要indexOf() 返回值不等于 -1,那就继续找
  3. 因为 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. 遍历获取每个字符,存储在对象中,字符为键,次数为值
  2. 如果该字符存在在对象中,直接令其值+1;否则添加该字符,值为1
  3. 最后用 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"]

splitjoin相反,join是将数组转换为字符串

去除头尾空白

var str = ' zx c  '
console.log(str.trim());  // zx c

只能去除头部和尾部的空白