这是大冰块2021年第1篇原创文章,和大冰块一起在前端领域努力吧!!!
字符串截取和拼接是字符串最我们最常用也是最易错的方法。主要原因是 substr() 和 slice() 和 substring()的区别看起来很乱,有很多小伙伴还不太明白。
所以今天大冰块牺牲了摸鱼 休息时间,重新整理了一遍关于这三个截取字符串方法之间的区别。
首先来归纳总结一下三个方法的传参:
substr():
参数一(必须):一个整数,要开始截取字符的下标,如为负则代表从尾部开始截取。 参数二(可选):一个整数,要截取字符的数量。如果省略该参数,则默认为string.length,即当前字符串的长度。
slice() :
参数一(必须):一个整数,要开始截取字符的下标,如为负则代表从尾部开始截取。 参数二(可选):一个整数,要结束截取字符的下标,如为负则代表从尾部截取多少个字符。如果省略该参数,则默认为string.length,即当前字符串的长度。
substring() :
参数一(必须):一个非负的整数,要开始截取字符的下标。 参数二(可选):一个非负的整数,要结束截取字符的下标。如果省略该参数,则默认为string.length,即当前字符串的长度。
下面从传参不同详细说下它们的区别:
两个参数都为正的时候:
它们的参数一都表示从某下标处开始截取。 substr() 的参数二代表一共截取多少位; slice() 和substring() 的参数二则代表截取到某下标(不包含此下标处字符)。
两个参数都为负的时候:
substr() 和slice() 的参数一表示从尾部开始截取。 slice() 参数二表示从尾部第n个下标结束截取。 substr()参数二表示截取负数位,截取值为空 。 substring()则把参数一和参数二都转为0,截取为空。
只有一个参数且为正的时候:
它们的参数一都表示从某下标处开始截取。 参数二都默认为当前字符串的长度length。
只有一个参数且为负的时候:
substr() 和slice() 的参数一表示从尾部第n个下标开始截取; substring()则把参数一转为0。 它们的参数二都默认为当前字符串的长度length。
第一个参数为正,但第二个参数为负的时候:
substr() 和slice() 的参数一都表示从某下标处开始截取。 substr()参数二表示截取负数位,截取值为空。 slice()参数二表示从尾部第n个下标结束截取。 substring() 则把第一个参数转为0,第二个参数改为第一个参数的值。
第一个参数为负,但第二个参数为正的时候:
substr() 和slice() 的参数一都表示从尾部第n个下标开始截取,substring() 则把参数一转为0,它们的参数二则代表截取到某下标(不包含此下标处字符)。
用法1: string.substr(start,length)
用法2: string.slice(start,end)
用法3: string.substring(start,end)
例子一: (两个参数都为正)
let str = '0123456789'
let result1 = str.substr(2,5) // 从下标2开始截取,截取5位
let result2 = str.slice(2,5) // 从下标2开始截取,截取到下标5(不含下标5)
let result3 = str.substring(2,5) // 从下标2开始截取,截取到下标5(不含下标5)
console.log(result1) // 控制台打印:23456
console.log(result2) // 控制台打印:234
console.log(result3) // 控制台打印:234
例子二: (两个参数都为负)
let str = '0123456789'
let result1 = str.substr(-2,-5) // 相当于 str.substr(str.length-2,-5),相当于 str.substr(8,-5), 从下标8开始截取,截取-5位
let result2 = str.slice(-2,-5) // 相当于 str.substr(str.length-2,str.length-5),相当于 str.substr(8,5), 从下标8开始截取,截取到下标5(不含下标5)
let result3 = str.substring(-2,-5) // 相当于 str.substr(0,0)
// 因为截取下标的区间都不存在元素,所以打印都为空
console.log(result1) // 控制台打印:
console.log(result2) // 控制台打印:
console.log(result3) // 控制台打印:
例子三: (只有一个参数且为正)
let str = '0123456789' // str.length为10
let result1 = str.substr(2) // 相当于 str.substr(2,str.length),相当于 str.substr(2,10),不足10位取到最后一位
let result2 = str.slice(2) // 相当于 str.slice(2,str.length),相当于 str.slice(2,10)
let result3 = str.substring(2) // 相当于 str.substring(2,10)
console.log(result1) // 控制台打印:23456789
console.log(result2) // 控制台打印:23456789
console.log(result3) // 控制台打印:23456789
例子四: (只有一个参数且为负)
let str = '0123456789' // str.length为10
let result1 = str.substr(-2) // 相当于 str.substr(str.length-2,str.length),相当于 str.substr(8,10),不足10位取到最后一位
let result2 = str.slice(-2) // 相当于 str.slice(str.length-2,str.length),相当于 str.slice(8,10)
let result3 = str.substring(-2) // 相当于 str.substring(0,10)
console.log(result1) // 控制台打印:89
console.log(result2) // 控制台打印:89
console.log(result3) // 控制台打印:0123456789
例子五: (第一个参数为正,但第二个参数为负)
let str = '0123456789' // str.length为10
let result1 = str.substr(2,-5) // 从下标2开始截取,截取-5个字符,为空
let result2 = str.slice(2,-5) // 从下标2开始截取,截取到str.length-5,即相当于 str.slice(2,5)
let result3 = str.substring(2,-5) // 相当于 str.substring(0,2) ,即当substring的第一个参数为正数,第二个参数为负数时,则会把第一个参数作为0,第二个参数改为第一个参数的值即2。
console.log(result1) // 控制台打印:
console.log(result2) // 控制台打印:234
console.log(result3) // 控制台打印:01
例子六: (第一个参数为负,但第二个参数为正)
let str = '0123456789' // str.length为10
let result1 = str.substr(-2,5) // 相当于 str.substr(str.length-2,5),相当于 str.substr(8,5)
let result2 = str.slice(-2,5) // 相当于 str.slice(str.length-2,5),相当于 str.substr(8,5),为空
let result3 = str.substring(-2,5) // 相当于 str.substring(0,5),即当substring的第一个参数为负数时,则会把第一个参数作为0。
console.log(result1) // 控制台打印:89
console.log(result2) // 控制台打印:
console.log(result3) // 控制台打印:01234
写在后面
这是大冰块《看完就懂系列》的第1篇文章,《看完就懂系列》旨在把一些常见的概念或方法以通俗易懂的方式呈现出来。欢迎大家点击其他文章一起讨论学习:
- 《看完就懂系列》答应我,看完就开始用Symbol好吗?
- 《看完就懂系列》谈谈数据埋点的原理与实现
- 《看完就懂系列》Ajax是不是凭一己之力造就了整个前端的生态圈?
- 《看完就懂系列》项目中的权限管理复杂吗?
- 《看完就懂系列》天哪!搞懂节流与防抖竟简单如斯~
- 《看完就懂系列》15个方法教你玩转字符串
原创不易,如有错误,欢迎指出。
如果有帮助到你,请给大冰块来个三连(点赞收藏评论),让我们一起在前端的路上进步吧~🤭