前言:
字符串的方法的操作在面试的过程非常常见,虽然不难,但是太多了记不住啊,老是容易忘,干脆总结成一个笔记,到时候要看的时候方便复习,最后会在后面穿插一些常见的面试题,以加强这方面的能力。
铺垫
一、从前往后查找,起始索引为0,两个数字之间的索引是[ ) 半开区间,前闭后开
二、以下所有的改变都不会修改原字符串,是复制一份字符串再进行修改的
var str = “abccaabbccdgbca”;
1、indexOf(要查找的字符,开始的位置(可选)):返回指定字符串第一次出现的位置。
str.indexOf('a'); //0
str.indexOf('bcc'); //1
注意点:
-
indexOf()方法对大小写敏感,如果子字符串没有找到,返回-1。
str.indexOf("A"); //-1
2、lastIndexOf(要查找的字符);返回指定字符串最后一次出现的位置,)
str,lastIndexOf('a'); //14
str.lastIndexOf('b'); //12
str.lastIndexOf('bcc'); //7
注意点:
-
lastIndexOf()方法对大小写敏感,如果子字符串没有找到,返回-1。
str.lastIndexOf("A"); //-1
3、toUpperCase(): 把字符串转换成大写,(对中文字符串没用)
str.toUpperCase(); //"ABCCAABBCCDGBCA"
4、toLowerCase(); 把字符串小写转换成大写,(对中文字符串没用)
str.toLowerCase(); //"abccaabbccdgbca"
var str = “abccaabbccdgbca”;
5、 substring(num.num); 提取字符串中两个指定索引号之间的字符
str.substring(1,3); // "bc"
str.substring(0,4); // "abcc"
注意点:
-
(两个索引不能为负值,不能为NaN,如果为负数或NaN,替换成0)
str.substring(-1,3); //"abc" ===str.substring(0,3) str.substring(-1,-3) ;//" " ====str.substring(0,0)
-
字符串的长度取两数字之间的绝对差(也可以理解为小的在前,大的在后)
str.substring(2,5); //"cca" str.substring(5,2); //"cca"
-
超出字符串长度的索引默认为字符串最大长度
str.substring(0,30); //"abccaabbccdgbca"
var str = “abccaabbccdgbca”;
6、substr(num, Lenght) : 返回一个从指定位置开始,指定长度的子字符串。
str.substr(0,3); //"abc"
str.substr(0,0); //" " 长度为0返回空字符串
注意点:
-
如果Lenght没有指定参数,将取到(start)后面剩余的所有字符串
str.substr(2); //"ccaabbccdgbca" str.substr(2,); //"ccaabbccdgbca"
-
超出字符串长度的索引默认为字符串最大长度
7、slice(num , num); 提取字符串中两个指定索引号之间的字符,与substring一样,(数组也有slice()方法)
str.slice(0,3); //"abc"
str.slice(2,5); //"cca"
注意点:
-
允许两个索引的数值为负,负数的计算规则是——负数+length,如果第一位索引为负数,第二位是正数,并且得到的结果大于第二位索引,不复制任何元素到新数组中
str.slice(-2,5); // " " ===str.slice(13,5) str.slice(-2,15); // "ca" ===str.slice(13,15) str.slice(0,-1); //"abccaabbccdgbc" ===str.slice(0,14)
-
第二位数字的索引如果不存在,默认取第一位索引后面的所有字符串
str.slice(0); //"abccaabbccdgbca" str.slice(0,); //"abccaabbccdgbca" str.slice(14); //"a"
-
超出字符串长度的索引默认为字符串最大长度
str.slice(0,19); //"abccaabbccdgbca"
8、concat(要拼接的字符串(可选)): 连接两个或多个字符串,返回连接后的新字符串。不影响原字符串,(数组也有concat()方法)
var str1 = "abc"
var str2 = "efg"
str1.concat(str2); //"abcefg"
str2.concat(str1); //"efgabc"
注意点:
-
如果concat里面不拼接字符串,相当于复制一份字符串
str1.concat(); //“abc”
var str = “abccaabbccdgbca”;
9、split(分隔成数组的条件,限制返回的个数(可选)),把字符串分割为子字符串数组
str.split("" ); //["a", "b", "c", "c", "a", "a", "b", "b", "c", "c", "d", "g", "b", "c", "a"]
str.split("",3 ); //["a", "b", "c"]
表示以空格为分隔条件分隔字符串
10、charAt(num); 返回指定索引的字符
str.charAt(1); //b
注意点:
-
超出字符串长度的索引默认为空
str.charAt(20); // " "
-
不填索引值默认为0
str.charAt(0); //a str.charAt( ); //a
var str = “abccaabbccdgbca”;
11、charCodeAt( num );可以返回指定索引位置的字符的的Unicode编码。这个返回值是0-65535之间的正数。当(返回值是<=255,为英文,当返回值>=255时,为中文。
str,charCodeAt(0) //97
var str1 = "Hello 张三"
str1.charCodeAt(6); //24352
可以利用该方法获取字节长度
function retBytesLen(target) {
var count,
len;
count = len = target.length;
for (var i = 0; i < len; i++) {
if (target.charCodeAt(i) > 255) {
count++;
}
}
return count;
}
console.log(retBytesLen(str)); //15
var str = “abccaabbccdgbca”;
12、replace(要替换的, 被替换的):替换指定子串或者与正则表达式匹配的子串。
var reg = /a/ig //a代表要匹配的字符,i代表不区分大小写,g表示全局搜索
str.replace(reg,12); //"12bcc1212bbccdgbc12"
str.replace("a","m"); //"mbccaabbccdgbca"
13、match():取出匹配的一个或多个子串或正则表达式的匹配保存到一个新数组里。
var reg = /a/ig //a代表要匹配的字符,i代表不区分大小写,g表示全局搜索
str.match(reg) // ["a", "a", "a", "a"]
str.match("a") // ["a"]
replace 与match 的不同 :replace是替换匹配的内容,match 是捕捉到匹配的内容放到一个新数组里,一般用在正则表达式比较多
14、search(): 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。如果没有找到任何匹配的子串,则返回 -1。
var reg = /a/ig;
str.search('b'); //1
var reg = /m/ig;
str.search(reg); //-1 字符串中没有m,因此返回-1
注意点:
-
search()方法不区分大小写,因此正则加不加 i (不区分大小写)没有区别
var reg = /A/ig; str.search(reg); //0
15、str_reverse():将字符串的排序颠倒
该方法只存在数组,字符串没有该方法,可以自己实现
1、
利用charAt()方法: 根据输入的索引,获取对应的字符串
String.prototype.unique = function () {
let mystr = "";
if (!this) {
return;
} else {
for (var i = this.length; i >= 0; i--) {
mystr += this.charAt(i);
}
}
return mystr;
}
2、
利用数组split()方法:将数组转换成字符串
String.prototype.unique2 = function (){
let myStr = [],
str = this.split(''),
len = this.length
if(!this){
return;
}else{
for (var i = len; i >= 0; i--) {
myStr.push(str[i]);
}
}
return myStr.join('');
}
16、str_unique():字符串去重
var Str = 'asdfasknvsbodsfamklnafaoifhabsn'
var StrArr = myStr.split('');//字符串去重
//给数组的原型链上增加一个方法,去重数组
Array.prototype.unique = function(){
var temp = {},
arr = [],
len = this.length
for(var i = 0; i < len; i++ ){
//如果temp对象不存在属性名为temp[this[i]],则创建该属性名并赋值为abc,然后把属性名push到一个新数组里面
if(!temp[this[i]]){//temp[1] object对应的key(属性名)没有限制,只是如果是数字,取值的时候就不能用英文句号(.),只能用[]的方式取值
temp[this[i]] = 'abc';//这里不能为this[i],因为!0 ==true
arr.push(this[i]);
}
}
return arr //最后把新数组返回去
}
面试题:
1、请使用Js实现将“zhangsan”这个字符串转换成大写,然后逆序输出字符串,以及输出字符 'x’在字符串中的位置
String.prototype.str_Index = function(p){
//第一步:将字符串装换成大写
let str_up = this.toUpperCase();
// 第二步,逆向输出字符
let strArr = [],
str = str_up.split('');
len = str_up.length;
for(let i = len; i >= 0; i--){
strArr.push(str[i]);
}
return strArr.join('').indexOf('p');
}
继承方式实现,个人解决方法,不喜勿喷
2、题目: 查找字符串中出现最多的字符和个数?
例如:abbcccddddd -> 字符最多的是d,出现了5次
方法一、
let str = "abbcccddddd";
let obj = {};
// 生成obj对象
for(let i = 0;i < str.length; i++){
let cur = str[i]; // 当前字符 //a,b,b,c,c,c...
if(!obj[ cur ]){
obj[ cur ] = [];
}
obj[ cur ].push(cur);
}
// 统计次数
let num = 0;
let char = '';
for(item in obj){
if(num < obj[item].length){
num = obj[item].length;
char = obj[item][0];
}
}
console.log(`字符最多的是${char},出现了${num}次`);