为了方便操作基本数据类型,JavsScript 还提供了三个特殊的引用类型:`String`、`Number`、`Boolean`<br />基本包装类型就是把简单数据类型包装成复杂数据类型,这样基本数据类型就有了属性和方法。
9.1 String
要创建一个 String 对象,使用 String 构造函数并转入一个数值
let arr = new String('feng mou')
String 对象的方法可以在所有字符串原始值上调用。3个继承的方法 valueOf()、toLocaleString() 和 toString() 都返回对象的原始字符串值。
每一个String对象都有一个length属性,用来表示字符串中字符的数量
let objectString = 'wo shi shuai shuai'
console.log(objectString.length); // 18 空格也算一个字符
字符串的不可变
指的是里面的不可变,虽然看上去可以改变内容,但其实是地址变了,内存中新开辟了一个内存空间。
- 当重新给字符串变量赋值的时候,变量之前保存的字符串不会被修改,依然在内存中重新给字符串赋值,会重新在内存中开辟空间,这个特点就是字符串的不可变。
- 由于字符串的不可变,在大量拼接字符串的时候会有效率问题
1. charAt()方法
charAt()
方法返回给索引位置的字符,由传给方法的整数参数指定。具体来说,这个方法查找指定索引位置的 16 为码元,并返回该码元对应的字符:
let name = 'song';
console.log(name.charAt(2)); // "n"
简单来说,charAt()
方法返回的是括号里选中元素在字符串中的位置(位置排序和数组相同,从0开始)
例子:提取出字符串中每种字符,并显示出次数
let a = 'asfagsddagsfdasdasfsgdwgrfghhkhjthcjfgyyhbjutggyyj'
var o = {};
for (let i=0 ; i<a.length;i++){ //遍历字符串,
let chart = a.charAt(i); //使用charAt()函数提前每个字符
//o[chart]里由于chart里装载字符在变,不适合加‘’来定死
if(o[chart]){ //if语句提取到underfined 转换成false执行
o[chart]++; //if(k in o){ 通过 in 判断k变量是否在o对象里
}else //o[k]++ } 在就自加
{o[chart]=1;} //else{ o[k]=1} 不在就赋值1
}
console.log(o);
//遍历对象,取出出现最对的字符及其次数
let max = 0,
car='',
carsh=[];
for (let k in o){
if(o[k]>max){
max=o[k];
char = k;
}
carsh.push([k,o[k]])
}
console.log('出现次数最多的是'+char+'出现次数为'+max);
console.log(carsh);
console.log('----------');
let kk = Array.from(carsh) //使用fro()进行浅复制,用于改变carsh排列方式
console.log(kk.sort());
2. charCodeAt()方法
使用 charCodeAt() 方法可以查看指定码元的字符编码。这个方法返回指定索引位置的码元值,索引以整数指定
let message = 'abcde';
// Unicode "Latin small letter C"的编码是 U+0063
console.log(message.charCodeAt(2)); // 99
console.log(99 === 0x63); // true
3. 字符串操作方法
1. concat() 方法
将一个或多个字符串拼接成一个字符串
let one = 'zhang';
let tow = one.concat('chao','yu');
console.log(tow); // "zhang chao yu"
console.log(stringValue); // "zhang"
concat()
方法可以添加不止一个字符串- 拼接完原本字符串不会改变
- 效率太低,还没有“+”速度快,而且大多数情况下,对于拼接多个字符串来说,使用加号更方便。
提取字符串
ECMAScript 提供了 3 个从字符串中提取字符串的方法:slice()
、substr()
和substring()
。这3个方法都返回调用它们的字符串的一个子字符串,而且都接收一或两个参数。
- 第一个参数表子字符串开始的位置,第二个参数表示子字符串结束的位置。对
slice()
和substring()
而言,第二个参数是提取结束的位置(即该位置之前的字符会被提取出来)。 - 对
substr()
而言,第二个参数表示返回的子字符串数量。任何情况下,省略第二个参数都意味着提取到字符串末尾。 与
consat()
方法一样,slice()
、substr()
和substring()
也不会修改调用它们的字符串,而只会返回提取到的原始新字符串值。let stringValue = 'hello world';
console.log(stringValue.slice(3)); //"lo world"
console.log(stringValue.substring(3)); //"lo world"
console.log(stringValue.substr(3)); // "lo world"
console.log(stringValue.slice(3, 7)); // "lo w"
console.log(stringValue.substring(3,7)); // "lo w"
console.log(stringValue.substr(3, 7)); // "lo worl"
在这个例子中,
slice()
、substr()
和substring()
是以相同方式被调用的,而且多数情况下返回的值也相同。- 如果只传一个参数 3,则所有方法都将返回”lo world”,因为”hello”中”l”位置为 3。
- 如果传入两个参数 3 和 7,则
``slice()
和substring()
返回”lo w”(因为”world”中”o”在位置 7,不包含),而 substr()返回”lo worl”,因为第二个参数对它而言表示返回的字符数。 - 当某个参数是负值时,这 3 个方法的行为又有不同。比如,
slice()
方法将所有负值参数都当成字符串长度加上负参数值。而substr()
方法将第一个负参数值当成字符串长度加上该值,将第二个负参数值转换为 0。 substring()
方法会将所有负参数值都转换为 0let stringValue = "hello world";
console.log(stringValue.slice(-3)); // "rld"
console.log(stringValue.substring(-3)); // "hello world"
console.log(stringValue.substr(-3)); // "rld"
console.log(stringValue.slice(3, -4)); // "lo w"
console.log(stringValue.substring(3, -4)); // "hel"
console.log(stringValue.substr(3, -4)); // "" (empty string)
这个例子明确演示了 3 个方法的差异。在给
slice()
和substr()
传入负参数时,它们的返回结果相同。这是因为-3 会被转换为 8(长度加上负参数),实际上调用的是 slice(8)和 substr(8)。而substring()方法返回整个字符串,因为-3 会转换为 0。- 在第二个参数是负值时,这 3 个方法各不相同。
slice()
方法将第二个参数转换为 7,实际上相当于调用 slice(3, 7),因此返回”lo w”。 - 而
substring()
方法会将第二个参数转换为 0,相当于调用substring(3, 0
),等价于 substring(0, 3),这是因为这个方法会将较小的参数作为起点,将较大的参数作为终点。 - 对
substr()
来说,第二个参数会被转换为 0,意味着返回的字符串包含零个字符,因而会返回一个空字符串。
2. 字符串位置方法
有两个方法用于在字符串中定位子字符串:indexOf() 和 lastIndexOf()。
- 这两个方法从字符串中搜索传入的字符串,并返回位置(如果没找到,则返回-1)。
- 两者的区别在于,indexOf()方法从字符串开开始查找子字符串,而 lastIndexOf()方法从字符串末尾开始查找子字符串
let stringValue = 'hello world';
console.log(stringValue.indexOf("o")); // 4
console.log(stringValue.lastIndexOf("o")); // 7
3. replace() 方法
replace() 方法用于在字符串中用一些字符替换另一些字符,其使用格式如下:
字符串名.replace(被替换的字符串,要替换为的字符串);
4. split()
split()方法用于切分字符串,它可以将字符串切分为数组。在切分完毕之后,返回的是一个新数组。
通过字符串内的符合对字符串进行切割
字符串名.split("分割字符")
let arr = ["name = fengmou"]
let newArr = arr.split('=')
console.log(newArr); //['name','fengmou']