字符串对象
6.1 基本包装类型
为了方便操作基本数据类型,JavaScript还提供了三个特殊的引用类型:String、Number和Boolean。
基本包装类型就是把简单数据类型包装成复杂数据类型,这样基本数据类型就有了属性和方法。
var str = ‘hello’;
console.log(str.length) ;
按道理基本数据类型是没有属性和方法的,而对象才有属性和方法,但上面代码却可以执行,因为js会把基本数据类型包装成复杂数据类型,执行过程如下:
//1.生成临时变量,把简单类型包装成复杂数据类型
var temp = new String(‘hello’);
//2.赋值给声明的字符变量
str = temp;
3.销毁临时变量
temo = null;
6.2 字符串的不可变
指的是里面的值不可变,看上去可以改变内容,但其实是地址变了,内存中新开辟了一个内存空间。
var str = 'hello';
console.log(str);
str = 'world';
console.log(str);
var str = '';
for (var i = 0; i <= 100000; i++) {
str += i;
}
console.log(str); // 结果需要花费大量的时间来显示,因为需要不断开辟新空间
(1)当重新给str赋值的时候,常量‘hello’不会被修改,依然在内存中
(2)重新给字符串赋值,会重新在内存中开辟空间,这个特点就是字符串的不可变
(3)由于字符串的不可变,在大量拼接字符串的时候会有效率问题、
6.3 根据字符串返回位置
字符串的所有方法,都不会修改字符串本身(字符串是不可变的),操作完成会返回一个新的字符串。
方法名 | 说明 |
---|---|
indexOf(‘要查找的字符’,[开始的位置]) | 返回指定内容在字符串中的位置,如果找不到就返回-1,开始的位置是index索引号 |
lastIndexOf() | 从后往前找,只找第一个匹配的 |
- indexOf(),根据字符串返回第一个满足条件的字符串索引 / 位置(只查找一个元素)【数组中也有】
(1)返回数组元素索引号,indexOf(字符串),从前面开始查找
(2)它只会返回第一个满足条件的索引号
(3) 如果该数组里面找不到元素,则返回 -1
(4)可以指定开始的位置,【】是可选的意思
(5)也可以检测一个字符串是否存在,== -1就是不存在
var str = '今天天气真不错,这天真不错';
console.log(str.indexOf('天')); // 1
console.log(str.indexOf('天', 2)); // 9
if (str.indexOf('天') == -1) { // 可以检测一个字符串是否存在,==-1就是不存在
alert('no');
} else {
alert('yes');
}
综合案例(返回字符位置)
- 查找字符串”abcoefoxyozzopp“中所有o出现的位置以及次数
var str = 'abcoefoxyozzopp';
var index = str.indexOf('o');
var num = 0;
while (index !== -1) {
console.log(index); // 第一个o出现的位置
num++;
// indexOf只能查找第一个,所有后面的查找就利用第二个参数,当前所有加1,从而继续查找
index = str.indexOf('o', index + 1);
}
console.log('o出现的次数是:' + num);
- 数组[‘red’,‘blue’,‘red’,‘green’,‘pink’,‘red’,‘red’]中red出现的次数
var arr = ['red', 'blue', 'red', 'green', 'pink', 'red', 'red'];
var index = arr.indexOf('red');
var num = 0;
while (index !== -1) {
console.log(index);
num++;
index = arr.indexOf('red', index + 1);
}
console.log('red出现的次数是:' + num);
6.4 根据位置返回字符串(重点)
方法名 | 说明 |
---|---|
charAt(index) | 返回指定位置的字符(index字符串的索引号),用法:str.charAt(0) |
charCodeAt(index) | 获取指定位置处字符的ASCII码(index索引号),用法:str.charCodeAt(0) |
str[index] | 获取指定位置处字符 |
- charAt(index),根据位置返回字符串
var str = 'hello';
console.log(str.charAt(1)); // e
//遍历所有的字符
for (var i = 0; i < str.length; i++) {
console.log(str.charAt(i)); // 等价于 str[i]
}
- charCodeAt(index),返回的是索引号的ASCII值,目的:可以判断用户按下了键盘哪个键
var str = 'hello';
console.log(str.charCodeAt(0)); // 104,返回的是 ASCII码
- str[index],H5新增的,获取指定位置字符
var str = 'hello';
console.log(str[0]); // h
综合案例(返回字符位置)
- 判断字符串”abcoefoxyozzopp“中出现次数最多的字符,并统计次数
var str = 'abcoefoxyozzopp';
var o = {};
for (var i = 0; i < str.length; i++) {
var chars = str.charAt(i); // chars获得的是字符串中的 每一个字符
if (o[chars]) { // o[chars] 得到的是属性值 例如:{a,b...}
o[chars]++;
} else {
o[chars] = 1;
}
}
console.log(o);
var max = 0;
var ch = ''; // 用来存储出现最多次数的字符
// 遍历对象属性
for (var k in o) {
// k得到的是 属性名
// o[k]得到的是 属性值
if (o[k] > max) {
max = o[k];
ch = k;
}
}
console.log('出现最多的字符是:' + ch + ',共' + max + '次');
6.5 字符串操作方法(重点)
方法名 | 说明 |
---|---|
concat(str1,str2,str3…) | concat() 方法用于连接两个或多个字符串。拼接字符串,等效于+,+更常用 |
substr(start,length) | 从start位置开始(索引号),length取的个数 |
slice(start,end) | 从start位置开始(索引号),截取到end位置,end取不到 |
substring(start,end) | 从start位置开始(索引号),截取到end位置,end取不到,基本和slice相同,但是不接受负值 |
- concat(‘字符串1’,‘字符串2’,…),拼接字符串【数组中也有】
var str = 'hello';
var a = '18';
console.log(str.concat(a, 'world')); // hello18world
console.log(str + a); // helloworld
- substr(start,length),通过索引指定位置开始查找一个或多个字符串
(1)substr()类似于数组的splice(),但是数组的是删除,字符串的是查找
(2)参数:
a.第一个参数,开始位置的索引(包括开始位置)
b.第二个参数,截取的长度(截取多少个数)
var str = 'hello';
console.log(str.substr(3, 2)); // lo
- slice(start,end),可以从字符串中截取指定的内容【数组中也有】
(1)不会影响原字符串,而是将截取到的内容返回
(2)参数:[左闭右开)
a.第一个参数,开始位置的索引(包括开始位置)
b.第二个参数,结束位置的索引(不包括结束位置)
-第二个参数也可以省略,则返回开始位置后的索引数
-也可以传递一个负数作为参数,负数的将会从后边计算
var str = 'abcdefg';
var re = str.slice(0, 2); // ab
re = str.slice(1); // 从索引为1开始后的全部
re = str.slice(-1); // g
re = str.slice(0,-3); // abcd
console.log(re);
- substring(start,end),可以用来截取一个字符串,跟slice()类似
参数:[左闭右开)
a.第一个参数,开始位置的索引(包括开始位置)
b.第二个参数,结束位置的索引(不包括结束位置)
-不同的是这个方法不能接收负数作为参数,如果传递了一个负值,则默认使用0
-而且他还会自动调整参数的位置,如果第二个参数小于第一个参数,则自动交换位置
var str = 'abcdefg';
var re = str.substring(0, 2); // ab
re = str.substring(1, 0); // a == str.substr(0,1);
console.log(re);
6.6 字符串转换为数组
方法名 | 说明 |
---|---|
split() | 字符串转换为数组 |
split(‘分隔符’),字符串转换为数组,以字符串中存在的分隔符去分割
(1)split()可以转换为数组,分隔符取决于字符串中用什么分开
(2)跟数组的join()方法相反,是数组转为字符串
var str = 'red,pink,blue';
console.log(str); // red,pink,blue
console.log(str.split(',')); // ["red", "pink", "blue"]
var str2 = 'red&pink&blue';
console.log(str2.split('&')); // ["red", "pink", "blue"]
6.7 字符串其余方法
方法名 | 说明 |
---|---|
replace() | 将字符串中指定内容替换为新内容,不影响原数组 |
toUpperCase() | 将字符串转换大写 |
toLowerCase() | 将字符串转换小写 |
- replace(‘被替换的字符’,‘替换为的字符’),替换字符串
(1)不会影响原字符串,而是将截取到的内容返回
(2)参数:
a.第一个参数,被替换的内容
b.第二个参数,新的内容
(3)默认只会替换第一个满足条件的
var str = 'blueblue';
console.log(str.replace('b', '2')); // 2lueblue 只替换第一个b
- 循环替换所有的字符
var str = 'blueblue';
while (str.indexOf('b') !== -1) {
str = str.replace('b', '*');
}
onsole.log(str); // *lue*lue,把 b全部替换了
- 正则替换所有的字符
var str = 'bluebluebbbbbb';
var re = str.replace(/b/gi, "*"); // i (忽略大小写) g (全文查找出现的所有匹配字符)
console.log(re); // *lue*lue******
- toUpperCase(),将字符串转换成大写并返回
- toLowerCase(),将字符串转换成小写并返回
var str = 'abcde';
console.log(str.toUpperCase()); // ABCDE
str = 'ABCDE';
console.log(str.toLowerCase()); // abcde
综合案例
字符串"abaasdffggghjjkkgfddsssss3444343",完成以下问题
1.字符串的长度
2.取出指定位置的字符串,如:a,4,3…
3.查找指定字符是否在以上字符串中存在,如:i,c…
4.替换指定的字符,a替换成22,4替换成k
5.截取指定开始位置到结束位置的字符,如:取1-5的字符串
6.找出以上字符串中出现次数最多的字符和次数
7.指定字符出现的位置和次数
//1.
var str = 'abaasdffggghjjkkgfddsssss3444343';
console.log(str.length);
var str = 'abaasdffggghjjkkgfddsssss3444343';
//2.指定位置的字符(一次只能取一个)
console.log(str.charAt(1));
console.log(str.charAt(3));
for (var i = 0; i < str.length; i++) {
console.log(str.charAt(i)); // 循环可以取出每个字符
}
var str = 'abaasdffggghjjkkgfddsssss3444343';
//3.
var a = '3'; // 存在
a = 'i'; // 不存在
if (str.indexOf(a) == -1) {
console.log('该数不存在');
} else {
console.log('存在');
}
var str = 'abaasdffggghjjkkgfddsssss3444343';
//4.替换字符(一次只能替换一个)
console.log(str.replace('a', '22'));
//循环替换所有的字符
while (str.indexOf('a') !== -1) {
str = str.replace('a', '22');
}
console.log(str);
//正则替换所有字符
var re = str.replace(/4/gi, 'k');
console.log(re);
var str = 'abaasdffggghjjkkgfddsssss3444343';
//5.
var re = str.slice(1, 5); // (start,end) end取不到
re = str.substring(1, 5); // (start,end) end取不到
re = str.substr(1,5); // (start,length)
console.log(re);
var str = 'abaasdffggghjjkkgfddsssss3444343';
//6.
var o = {};
for (var i = 0; i < str.length; i++) {
var chars = str.charAt(i);
if (o[chars]) {
o[chars]++;
} else {
o[chars] = 1;
}
}
console.log(o);
var max = 0;
var ch = '';
for (var k in o) {
if (o[k] > max) {
max = o[k];
ch = k;
}
}
console.log('出现最多的字符是:' + ch + ',共' + max + '次');
var str = 'abaasdffggghjjkkgfddsssss3444343';
//7.
var a = 'a'; // 要查找的字符
var index = str.indexOf(a);
var num = 0;
while (index !== -1) {
console.log(index);
num++;
index = str.indexOf('a', index + 1);
}
console.log(a + '出现的次数为:' + num);