Skip to content

String类型

  1. typeof '' === 'string'
  2. Object.prototype.toString.call('') === '[object String]'

创建方式

1.1 字面量

js
var str = 'strsdf';

console.log(typeof str);  //'string'
console.log(Object.prototype.toString.call(str))   // '[object String]'

1.2 构造函数

js
var str1 = new String('strsdf');

console.log(typeof str1 === 'object');  //true
console.log(Object.prototype.toString.call(new String(" ")) )   // '[object String]'
  1. 字符串一旦创建就不可以改变
js
var str2 = 'name';
str2 = str2 + ' is gzh';
// 在内存中一共创建了 3 个 字符串   str2 -> 'is gzh' -> '然后创建一个 name is gzh'

转换方法

  • str.toString() 返回指定对象的字符串形式。
  • str.valueOf() 返回一个String对象的原始值
  • str.toLowerCase() 转小写
  • str.toUpperCase() 转大写

2.1 toString()、valueOf()

toString 没有继承Object.toString()方法,而是跟valueOf的实现一样 valueOf() 返回一个String对象的原始值

js
console.log("---------------  valueOf  ----------------------")

var strObj = new String("str");
var str = "str";
console.log(new String('str'))
console.log('str')

console.log(typeof strObj === 'object') //true
console.log(typeof strObj.valueOf() === 'string')      //true
console.log(typeof strObj.toString() === 'string')     //true

2.1 toLowerCase()、toUpperCase()

字符串转大写

js
console.log("---------------  toLowerCase  ----------------------")

var str = "str";
console.log('str'.toUpperCasse()); //"STR"
console.log('StR'.toLowerCasse()); //"str"

截取方法

  • slice() 提取一个字符串的一部分,并返回一新的字符串。
  • substr() 返回一个字符串中从指定位置开始到指定字符数的字符。
  • substring() 方法返回一个字符串在开始索引到结束索引之间的一个子集, 或从开始索引直到字符串的末尾的一个子集。
  • split() 使用指定的分隔符字符串将一个String对象分割成字符串数组,以将字符串分隔为子字符串,以确定每个拆分的位置。

3.1 slice()

提取一个字符串的一部分,并返回一新的字符串。

js
var newStr = str.slice(beginIndex[, endIndex]);
入参:
  • beginIndex :截取开始位置的索引,如果是负数 则当做beginIndex + length (包含)
  • endIndex : 截取结束位置的索引(没有的话就是字符串结尾),如果是负数 则当做beginIndex + length (不包含)
出参:
  • newStr :截取的字符串
1、 包含开始的索引位置字符,不包含结束的索引位置字符。
2、 如果 beginIndex > endIndex 结果为空 '';
3、 如果是负数只会加一次字符串的长度,不会多次相加;
: IE 都支持
js
var str = 'abcdefg';
console.log(str.slice(1,3));   //bc
console.log(str.slice(1));   //bcdefg
console.log(str.slice(1,200));   //bcdefg
console.log(str.slice(1,-2));   //bcde
console.log(str.slice(1,-9));   // ''
console.log(str.slice(-7,-9));   // ''

3.2 substr()

返回一个字符串中从指定位置开始到指定字符数的字符。

js
var newStr = str.substr(beginIndex[, length]);
入参:
  • beginIndex :截取开始位置的索引,如果是负数 则当做beginIndex + length (包含)
  • length : 提取的字符长度
出参:
  • newStr :截取的字符串
1、 包含开始索引位置的字符。
2、 如果开始位置的索引大于字符串的长度则 结果肯定为 '';
3、 如果开始位置的索引为负数,则不断相加length直到其为正数。
: IE 都支持
js
console.log("---------  substr  -----------")
var str = 'abcdefg';
console.log(str.substr(1,3));   //bcd
console.log(str.substr(1));   //bcdefg
console.log(str.substr(1,200));   //bcdefg
console.log(str.substr(-1,2));   // g
console.log(str.substr(-9,2));   // ab
console.log(str.substr(9,2));   // ''
console.log(str.substr(9,10));   // ''

3.3 substring()

返回一个字符串在开始索引到结束索引之间的一个子集, 或从开始索引直到字符串的末尾的一个子集。

js
var newStr = str.substring(beginIndex[, endIndex]);
入参:
  • beginIndex : 截取开始位置的索引,如果是负数当做0 如果大于length当做length
  • endIndex : 截取结束位置的索引(没有的话就是字符串结尾),如果是负数当做0 如果大于length当做length
出参:
  • newStr :截取的字符串
1、 如果 indexStart 等于 indexEnd,substring 返回一个空字符串。
2、 如果省略 indexEnd,substring 提取字符一直到字符串末尾。
3、 如果任一参数小于 0 或为 NaN,则被当作 0。
4、 如果任一参数大于 stringName.length,则被当作 stringName.length。
5、 如果 indexStart 大于 indexEnd,则 substring 的执行效果就像两个参数调换了一样。
: IE 都支持
js
console.log("---------  substring  -----------")
var str = 'abcdefg';
console.log(str.substring(1,3));   //bc
console.log(str.substring(1));   //bcdefg
console.log(str.substring(1,200));   //bcdefg
console.log(str.substring(199,200));   //''
console.log(str.substring(1,-2));   //a
console.log(str.substring(1,-9));   // a
console.log(str.substring(-14,-9));   // ''
console.log(str.substring(-14,2));   // ''

1、 substr(begin,length)与 slice()、substring()第二个参数 前面是截取字符串的长度,后面两个是结束位置的索引。
2、 substr(begin,length)、slice()的索引都是如果小于0 则按照index+length的方式,如果大于length 则按照length计算substring(begin,end)则是按照小于0则为0,大于length就为length。
3、 slice()、substr()、substring()第二个参数都可以省略,此时就按照从开始到结尾截取计算。

3.4 split()

使用指定的分隔符字符串将一个String对象分割成字符串数组,以将字符串分隔为子字符串,以确定每个拆分的位置。

js
var arr = str.split(separator[,limitNumber])
入参:
  • separator : 截取的 字符串、正则表达式。 如果正则表达式包含括号,则是分割后括号类的内容作为单独的一个字符串。
  • limitNumber : 限制分割后数组的长度。
出参:
  • newStr :截取的字符串
: IE 都支持
js
console.log("---------  split  ----------")
var str = ' Ab cd A SD';
var str1 = 'my name is agzh';
console.log(str.split(" "))       // ["", "Ab", "cd", "A", "SD"]
console.log(str.split(""))        // [" ", "A", "b", " ", "c", "d", " ", "A", " ", "S", "D"]
console.log(str.split())          // [" Ab cd A SD"]
console.log(str1.split(/a/))      // ["my n", "me is ", "gzh"]
console.log(str1.split(/(a)/))    // ["my n", "a", "me is ", "a", "gzh"]
console.log(str1.split(/n(a)/))   // ["my ", "a", "me is agzh"]
console.log(str1.split("",3))     // ["m", "y", " "]

字符串的拼接

  • concat() 将一个或多个字符串与原字符串连接合并,形成一个新的字符串并返回。 不修改源字符串。

4.1 concat()

将一个或多个字符串与原字符串连接合并,形成一个新的字符串并返回。

js
var newStr = str.concat(str1,str2 ...);
入参:
  • str : 源字符串。
  • str1 : 拼接的字符串。
出参:
  • newStr :拼接后的字符串
: IE 都支持
js
console.log("---------  concat  ----------")
var str = 'ab';
console.log(str.concat('cd'));    //abcd
console.log(str);                 //ab

console.log(1+'0');   // 10
console.log(1+ 1 + '12');   // 212  而不是 1112
// 所以我们需要拼接字符串的时候请使用concat()
function concat(){
    return String.prototype.concat.apply('',arguments);
}
console.log(concat(1,1,'12'))   // 1112
console.log(concat(1,1))        // 11

1、 我们字符串拼接可以使用 + 但是 + 会进行类型隐式转换 1+ 1 + '12' 结果为 212。
2、 字符串的拼接请使用concat不要使用 +。

字符串查询

  • charAt(index) 从一个字符串中返回指定的字符。
  • indexOf(str) 返回调用 String 对象中第一次出现的指定值的索引,开始在 fromIndex进行搜索。
  • includes() 用于判断一个字符串是否包含在另一个字符串中,根据情况返回 true 或 false。
  • search() 执行正则表达式和 String对象之间的一个搜索匹配。
  • match() 执行正则表达式和 String对象之间的一个搜索匹配。

5.1 charAt(index)

获取指定索引的字符串(0-length-1)

js
var char = str.charAt(index);
入参:
  • str : 源字符串。
  • index : 索引下标(0-length-1), 默认为 0 。
出参:
  • char :获取的索引字符,没有为 '';
1、 如果不在这个返回返回一个空字符串 ''。
2、 如果没有传入索引。则默认索引为 0。
: 都支持
js
var str = 'abcdefg';
console.log(str.charAt(2));   // c
console.log(str.charAt(11))   // ''
console.log(str.charAt())     // a

5.2 str.indexOf(searchValue[,fromIndex])

返回调用String 对象中第一次出现的指定值的索引,开始在 fromIndex进行搜索,没有则返回 -1

js
var index = str.indexOf(searchValue[,fromIndex])
入参:
  • searchValue : 查询的字符串。
  • fromIndex : 从什么位置开始查询。
出参:
  • char :获取的字符串,没有返回 -1;
1、 如果不在这个返回返回一个空字符串 ''。
2、 如果没有传入索引。则默认索引为 0。
: 都支持
js
console.log("---------  indexOf  ----------")
var str = 'abcabef';
console.log(str.indexOf('ab'));  //0
console.log(str.indexOf('ab',1));  //3
console.log(str.indexOf('abcd',1));  //-1
console.log(str.indexOf('bca',-3));  //1  
console.log(str.indexOf('bca','-3'));  //1
console.log(str.indexOf('bca',10));  //-1

5.3 str.lastIndexOf(searchValue[,fromIndex])

返回调用 String 对象中从后往前第一次出现的指定值的索引,开始在 fromIndex进行搜索,没有则返回 -1

js
var index = str.lastIndexOf(searchValue[,fromIndex])
入参:
  • searchValue : 查询的字符串。
  • fromIndex : 从什么位置开始查询(默认值为length。如果为负值,则被看作0。如果 fromIndex>length,则fromIndex被看作length。)
出参:
  • char :获取的字符串,没有返回 -1;
: 都支持
js
console.log("---------  lastIndexOf  ----------")
var str = 'abcabef';
console.log(str.lastIndexOf('ab'));  //3
console.log(str.lastIndexOf('ab',2));  //0
console.log(str.lastIndexOf('ab',4));  // 3  此时从 a开始往前 匹配发现a加后面的成功就成功
console.log(str.lastIndexOf('abcd',1));  // -1
console.log(str.lastIndexOf('bca',-3));  // -1 
console.log(str.lastIndexOf('bca','-3'));  // -1
console.log(str.lastIndexOf('bca',10));  //1

相同点:
1、 其都是获取第一次查询到的字符串的下标。
2、 没有都返回-1。
不同点:
3、 indexOf()的查询是从左至右进行查询,lastIndexOf()是从右至左进行查询。

5.4 var boolean = str.includes(searchValue[,fromIndex])

用于判断一个字符串是否包含在另一个字符串中,根据情况返回 true 或 false。

js
var boolean = str.includes(searchValue[,fromIndex])
入参:
  • searchValue : 查询的字符串。
  • fromIndex : 从什么位置开始查询
出参:
  • boolean :是否包含在字符串中
: 都支持
js
console.log("---------  includes  ----------")
var str = 'abcabef';

console.log(str.includes('ab'));  //true
console.log(str.includes('ab',1));  //true
console.log(str.includes('abcd',1));  //false
console.log(str.includes('bca',-3));  //true     
console.log(str.includes('bca','-3'));  //true     
console.log(str.includes('bca',10));  //false     

if(!String.prototype.includes){
    String.prototype.includes = function(searchValue,fromIndex){
        return this.indexOf(searchValue , fromIndex);
    }
}

用指定的正则搜索匹配字符串,返回匹配到索引的下标,没有返回-1。相对于test。

js
var firstIndex = str.search(RegExp)
入参:
  • RegExp : 正则表达式。
出参:
  • firstIndex :第一次出现的下标,没有返回-1
: 都支持
js
console.log("---------  search  ----------")
var str = 'abcabef';

console.log(str.search(/bca/));  //1
console.log(str.search(/ab/));   //0
console.log(str.search(/abdasd/));   //-1
console.log(str.search('ab'));      //0

5.5 match()

用指定的正则搜索匹配字符串,返回数组。

js
var array = str.match(RegExp)
入参:
  • RegExp : 正则表达式。
出参:
  • array 数组的第一项是进行匹配完整的字符串,之后的项是用圆括号捕获的结果。如果没有匹配到,返回null
: 都支持
js
console.log("---------  match  ----------")
var str = 'abcabef';

console.log(str.match(/bca/));  // ['bac',index: 1 ,input : 'abcabef']
console.log(str.match(/ab/));   // ["ab", index: 0, input: "abcabef"]
console.log(str.match(/ab/i));   //["ab", index: 0, input: "abcabef"]
console.log(str.match(/ab/g));   //["ab", "ab"]
console.log(str.match(/abdasd/));   //null
console.log(str.match('ab'));      //["ab", index: 0, input: "abcabef"]

相同点:
1、 都是通过正则去匹配字符串。
  • [ ] 待研究正则
不同点:
1、 search()相当于test match()相当于exec。所以search更快。
2、 返回结果不同,search是下标,match是一个数组

字符串的替换

  • replace()
  • trim()

6.1 replace()

返回一个由替换值替换一些或所有匹配的模式后的新字符串。模式可以是一个字符串或者一个正则表达式, 替换值可以是一个字符串或者一个每次匹配都要调用的函数。

js
var newStr = str.replace(regexp|substr, newSubStr|function);
入参:
  • regexp : 正则表达式。该正则所匹配的内容会被第二个参数的返回值替换掉。
  • substr : 一个要被 newSubStr 替换的字符串。其被视为一整个字符串,而不是一个正则表达式。仅仅是第一个匹配会被替换。
  • newSubStr : 用于替换掉第一个参数在原字符串中的匹配部分的字符串。该字符串中可以内插一些特殊的变量名。
  • function : 一个用来创建新子字符串的函数,该函数的返回值将替换掉第一个参数匹配到的结果。
出参:
  • newStr : 替换后的新字符串
: 都支持
js
console.log("---------  replace  ----------")
var str = 'abcabef';

console.log(str.replace("a","A"));    // Abcabef  只替换了第一个
console.log(str.replace(/a/g,'A'))    // AbcAbef  所有的a都替换成了A
console.log(str.replace(/a/i,'A'))    // Abcabef  只替换了第一个
console.log(str.replace(/a/g,function(match, index , sourceStr){
    // match  匹配的字符串
    // index  匹配的字符串的下标
    // sourceStr : 源字符串
    console.log(arguments)
    return match.toUpperCase()
}))    // AbcAbef  所有的a都替换成了A
//  $1 $$这个
//  TODO : 正则表达式

6.1 trim()

会从一个字符串的两端删除空白字符。

js
var newStr = str.trim();
出参:
  • newStr : 删除前后空格的新字符串
:IE9+ ,Chrome , FF(3.5) , Opera(10.5) , Safari(5)
js
console.log("---------  trim  ----------")

var str = "     name is ";
console.log(str.trim())   //name is
console.log(str.replace(" ",''))   //    name is 没有去除中文空格 tab等

if (!String.prototype.trim) {
  String.prototype.trim = function () {
    return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
  };
}