基本包装类型
按道理基本数据类型是没有属性和方法的,而对象才有属性和方法。但是,
为了方便操作基本数据类型,JavaScript 还提供了三个特殊的引用类型:String、Number和 Boolean。
基本包装类型就是把简单数据类型包装成为复杂数据类型,这样基本数据类型就有了属性和方法。
所以我们才可以在简单数据类型String上使用length属性
// 下面代码有什么问题?
var str = 'andy';
console.log(str.length);
//js 会把基本数据类型包装为复杂数据类型,其执行过程如下 :
// 1. 生成临时变量,把简单类型包装为复杂数据类型
var temp = new String('andy');
// 2. 赋值给我们声明的字符变量
str = temp;
// 3. 销毁临时变量
temp = null;
字符串的不可变
指的是里面的值不可变,虽然看上去可以改变内容,但其实是地址变了,内存中新开辟了一个内存空间。
当重新给字符串变量赋值的时候,变量之前保存的字符串不会被修改,依然在内存中重新给字符串赋值,会重新在内存中开辟空间,这个特点就是字符串的不可变。
由于字符串的不可变,在大量拼接字符串的时候会有效率问题
查找特定字符在字符串中的下标
- indexOf()方法
这个方法和数组的是一样的。从前往后查找,如果找不到就返回 -1 ,找到就返回第一个出现的下标位置。
语法:indexOf(‘要查找的字符’,开始查找的位置下标),第二个参数是可选的,不写默认从0开始
var str = '改革春风吹满地,春天来了';
console.log(str.indexOf('春'));
console.log(str.indexOf('春', 3)); // 从索引号是 3的位置开始往后查找
例子:查找字符串中某个字符出现的次数
// 查找字符串"abcoefoxyozzopp"中所有o出现的位置以及次数
// 核心算法:先查找第一个o出现的位置
// 然后 只要indexOf 返回的结果不是 -1 就继续往后查找
// 因为indexOf 只能查找到第一个,所以后面的查找,一定是当前索引加1,从而继续查找
var str = "oabcoefoxyozzopp";
var index = str.indexOf('o');
var num = 0;
// console.log(index);
while (index !== -1) {
console.log(index);
num++;
index = str.indexOf('o', index + 1);
}
console.log('o出现的次数是: ' + num);
- lastIndexOf()方法
lastIndexOf()就是和上面indexOf方法一样,只不过是从后往前查找。也是可以指定开始查找位置参数的。
根据位置返回字符串中的某个字符
- charAt(index)方法
charAt(index)方法返回指定位置的字符,参数index是指定字符在字符串中的下标
var str = 'andy';
console.log(str.charAt(3)); // 'y'
- charCodeAt(index)方法
返回相应索引号的字符ASCII值,在判断用户按下哪个键时候会用到。
var str = 'andy';
console.log(str.charCodeAt(0)); // 97
- str[index]写法
H5 新增的,IE8+支持,作用和charAt()方法是一样的
var str = 'andy';
console.log(str[3]); // 'y'
- search()写法
用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串,并返回子串的起始位置。
var str = "Visit abc!";
var n = str.search(/abc/i); // n=6
截取字符串
- substr(start,length)方法
substr(开始截取的位置下标,截取几个字符)
var str1 = '改革春风吹满地';
console.log(str1.substr(2, 2)); // '春风'
- slice(start,end)方法
这个方法和数组中的一样,从start位置开始截取,在end位置结束,截取出来的内容不包括end位置的字符。
拼接字符串
- concat()方法
concat()方法用于连接两个或多个字符串,拼接字符串,等效于+,+更常用
var str = 'andy';
console.log(str.concat('red')); // 'andyred'
替换字符串
用法1:replace(‘被替换的(原来的)字符串’,‘替换(新的)字符串’)
用法2:replace(‘正则表达式’,‘替换(新的)字符串’)
用法3:replace(‘正则表达式’,‘$1’)
写法 | 意思 |
---|---|
$ 1 ~ $ 99 | 表示与 正则表达式中的第 1 到第 99 个子表达式相匹配的文本。 |
$ & | 表示匹配成功的那个字符串 |
$ ` | 位于匹配子串左侧的文本。 |
$ ’ | 位于匹配子串右侧的文本。 |
$ $ | 表示一个 $ 符号 |
用法4:replace(‘正则表达式’,function(match,d1,d2,……,index,oristr){ return ‘替换(新的)字符串’ });
参数名称是自定义的,可以改,但是它的含义顺序是不变的。
参数 | 意思 |
---|---|
match | 匹配成功的那个字符串 |
d1 ~ d99 | 与 正则表达式中的第 1 到第 99 个子表达式相匹配的文本。 |
index | 匹配成功的那个字符串出现的位置 |
oristr | 原字符串 |
用法1的介绍:
replace() 方法用于在字符串中用一些字符替换另一些字符,其使用格式如下:
字符串.replace(被替换的字符串, 要替换为的字符串);
注意:这个方法只会替换第一个字符。(可以使用循环解决,就是indexOf方法作为循环条件)
联想 --》正则表达式中的替换字符,也是这个方法,只不过第一个参数变成正则表达式,而且正则表达式加了 g 参数就变成可以替换全部字符了。
var str = 'andyandy';
console.log(str.replace('a', 'b')); // 'bndyandy'
字符串转换为数组
- split()方法
split()方法用于切分字符串,它可以将字符串切分为数组。在切分完毕之后,返回的是一个新数组。
其使用格式如下:字符串.split(“分割字符”)
var str2 = 'red, pink, blue';
console.log(str2.split(','));
var str3 = 'red&pink&blue';
console.log(str3.split('&'));
字符串大小写转换
toUpperCase() 转换为大写
toLowerCase() 转换为小写
ES5中的新增方法
- trim( )方法
作用:删除字符串的两端空白字符
返回值:trim( )方法并不影响原字符串本身,它返回的是一个新的字符串
注意:不会去除字符串中间的空格,只会去除字符串前后两端的
调用方法:
var newStr = str.trim()
ES6中的新增方法
- 模板字符串
ES6新增的创建(声明)字符串的方式,使用反引号(叹号左边的那个键)定义。
let name = `zhangsan`;
模板字符串中可以通过 ${ 变量名 } 来解析变量。(以前传统的方法是需要字符串拼接来解析变量)
let name = '张三';
let sayHello = `hello,my name is ${name}`; // hello, my name is zhangsan
模板字符串中可以换行 ,输出的内容也是带换行的(以前传统的需要所有字符串内容都写在一行上,虽然可以使用 ’ \ ’ 来折行但还是不方便)
在模板字符串中可以调用函数
const sayHello = function () {
return '哈哈哈哈 追不到我吧 我就是这么强大';
};
let greet = `${sayHello()} 哈哈哈哈`;
console.log(greet); // 哈哈哈哈 追不到我吧 我就是这么强大 哈哈哈哈
- startsWith() 和 endsWith()
startsWith():表示参数字符串是否在原字符串的头部(原字符串是否以XX开头),返回布尔值
endsWith():表示参数字符串是否在原字符串的尾部,返回布尔值
let str = 'Hello world!';
str.startsWith('Hello') // true
str.endsWith('!') // true
- repeat()
repeat方法表示将原字符串重复n次,返回一个新字符串。
接收一个数值作为参数,表示需要重复的次数。
'x'.repeat(3) // "xxx"
'hello'.repeat(2) // "hellohello"
- includes( )
作用:判断一个字符串中是否包含一个指定的值
联想:indexof( )方法
返回值:包含返回true,否则返回false
参数:
第一个参数是必需的,表示需要查找是否存在这个值。
第二个参数是可选的,表示从该索引处开始查找 。如果为负值,则按升序从 array.length + fromIndex 的索引开始搜索。默认为 0。
调用方法:
'abcd'.includes('bc'); //返回的是true