JavaScript各类型方法整理(字符串部分)
前言
初中级前端工程师在工作中会因为使用错误的方法而引起各种bug,原因是有的方法并不是纯函数,会带来副作用,对调用方法的数据源进行修改,假如这不是你预期的后果,则会引起一些bug,而且这种bug往往查找起来比较费时费力,所以我在这里帮助大家(也提醒自己)梳理一下各种数据类型原生方法,看看哪些方法是纯函数,不带来副作用,不改变原数据~哪些方法会对原数据源进行修改,而且返回值可能并不是我们预期的值。
一、传统字符串方法
方法名 | 作用 | 描述 | 返回值 | 是否会修改原字符串 |
---|---|---|---|---|
indexOf(str,start ) | 查找字符串 | 返回字符串中指定文本首次出现的索引(位置)可接受第二个参数作为搜索起始位置 | 索引或-1 | 否 |
lastIndexOf(str,start ) | 查找字符串 | 返回字符串中指定文本最后一次出现的索引(位置)可接受第二个参数作为搜索起始位置 | 索引或-1 | 否 |
search(str||reg) | 查找字符串 | 返回字符串中指定文本首次出现的索引(位置)不同于indexOf的点:不能接受第二个参数,可以接受正则搜索 | 索引或-1 | 否 |
slice( start,end) | 切割字符串 | 提取字符串的某个部分并在新字符串中返回被提取的部分(不包括end项),如果忽略第二个参数,则切割剩下的部分 ,如果某个参数为负,则从结尾向前切割 | 切割后的新字符串 | 否 |
substring( +start,+end) | 切割字符串 | 类似于slice方法,区别是不能接收负的参数 | 切割后的新字符串 | 否 |
substr( start,length ) | 切割字符串 | 类似于slice方法,区别是在于第二个参数规定被提取部分的长度。 | 切割后的新字符串 | 否 |
replace( old,new ) | 替换字符串中某部分 | 用另一个值替换在字符串中指定的值,默认对大小写敏感(可以通过/i来执行大小写不敏感的替换),默认只替换首个匹配(用/g来执行整个字符串所有匹配项) | 替换后的新字符串 | 否 |
toUpperCase( ) | 转换成大写 | 把字符串转换为大写,不接收参数,执行方式为 usStr.toUpperCase() | 转换后的新字符串 | 否 |
toLowerCase( ) | 转换成小写 | 把字符串转换为小写,不接收参数,执行方式为 usStr.toLowerCase() | 转换后的新字符串 | 否 |
concat( str1,str2,… ) | 连接字符串 | 连接两个或多个字符串 | 组合后的新字符串 | 否 |
String.trim() | 去除空格 | 去除字符串两端的空白符(IE8以上支持) | 去空格后的新字符串 | 否 |
charAt(index) | 查找字符 | 查找字符串中指定下标(位置)的字符串 (优于ES5提供的【】属性访问字符串位置,不会返回undefined) | 字符串中index位置的字符 或者 空值 | 否 |
charCodeAt(index) | 查找字符 | 查找返回字符串中指定索引的字符 unicode 编码 | 字符串中index位置的unicode编码 或者 空值 | 否 |
二、ES6(及以后)新增的字符串方法
另外ES6提供了几个新的字符串方法,这里一并整理(只整理常用方法,详细的新增方法可以查阅阮一峰大神的ES6入门教程——字符串的新增方法):
方法名 | 作用 | 描述 | 返回值 | 是否会修改原字符串 |
---|---|---|---|---|
includes(str,start) | 判断字符串中是否包含某个字符 | 判断字符串中是否包含该字符,支持第二个参数,表示开始搜索的位置。 | 布尔值 | 否 |
startsWith(str,start) | 判断字符串是否以某个字符开头 | 表示参数字符串是否在原字符串的头部,支持第二个参数,表示开始搜索的位置。 | 布尔值 | 否 |
endsWith(str,start) | 判断字符串是否以某个字符结尾 | 表示参数字符串是否在原字符串的尾部,支持第二个参数,表示开始搜索的位置(不同于其他两个方法,endsWith方法的第二个参数是针对前n个字符)。 | 布尔值 | 否 |
repeat(times) | 将字符串复制times遍 | 参数如果是小数,会被取整。如果参数是负数或者Infinity,会报错。参数NaN等同于 0参数是字符串,则会先转换成数字, | 复制后的字符串 | 否 |
padStart(length,str) | 补全字符串 | ES2017 新增—— 用于字符串长度不足length时在字符串头部以str补全 | 补全后的字符串或原字符串,如果省略第二个参数则默认以空格补全,常见用途是补全指定位数 或者提示字符串格式 :‘09-12’.padStart(10, ‘YYYY-MM-DD’) // “YYYY-09-12” | 否 |
padEnd(length,str) | 补全字符串 | ES2017 新增—— 用于字符串长度不足length时在字符串尾部以str补全 | 补全后的字符串或原字符串,如果省略第二个参数则默认以空格补全,常见用途是补全指定位数 或者提示字符串格式 :‘09-12’.padStart(10, ‘YYYY-MM-DD’) // “YYYY-09-12” | 否 |
trimStart() | 去除头部空格 | 别名trimLeft() | 去除头部空格后的字符串。除了空格键,对字符串头部的 tab 键、换行符等不可见的空白符号也有效。 | 否 |
trimEnd() | 去除尾部空格 | 别名trimRight() | 去除头部空格后的字符串 。除了空格键,对字符串尾部的 tab 键、换行符等不可见的空白符号也有效。 | 否 |
三、总结
由此我们发现,所有的字符串方法都不会操作原字符串本身,而是会返回新字符串/索引值/布尔值等,其实是由于ECMAScript中的原始值都是不可变的,所以不单单是字符串,包括number类型的原生方法,也都不会改变其原始值。