# slice(), substring(), substr() 区别
### js截取字符串
#### slice()
```javascript
string.slice(start, end)
```
| 参数 | 描述 |
| :---- | :----------------------------------------------------------- |
| start | *必需*。要截取的字符串的起始下标。如果是负数,则数值为`string.length + start`。例如,-1指的是最后一个字符,-3指的是倒数第三个字符。 |
| end | *可选*。要截取的字符串的终止下标。如果省略改参数,slice()会一直提取到字符串末尾。如果是负数,则数值为`string.length + end`。 |
* 两个参数都是位置下标, 两个参数都支持负数,且两参数不会互换位置,始终是先`start`后`end`,如果区间不存在则返回空字符串`''`。
* 该方法返回的字符串包括start但不包括end,即[start, end)。
##### substring()
```javascript
string.substring(start, end)
```
| 参数 | 描述 |
| ----- | ---------------------------------------------------- |
| start | *必需*。要截取的字符串的起始下标。应是`非负的整数`。 |
| end | *可选*。要截取的字符串的终止下标。应是`非负的整数`。 |
* 两个参数都应该是非负数,如果`start`或`end`是负数,则会被转换成0。
* `start`和`end`两个参数,会是小的参数作为`start`,大的参数作为`end`。`start`和`end`相等,则会返回空字符串`''`。
* 如果两个参数中有正小数,则会把该参数向下取整。
* 如果两个参数有字符串,则会先进行parseInt(),如果转换结果为`NaN`,则会转换为0。
* 该方法返回的字符串包括start但不包括end,即[start, end)。
##### substr()
```javascript
string.substr(start, length)
```
| 参数 | 描述 |
| ------ | ------------------------------------------------------------ |
| start | *必需*。要截取的字符串的起始下标。如果是负数,则数值为`string.length + start`。 |
| length | *可选*。要截取的字符串的长度。如果是负数,则会被当做0处理,返回空字符串`''`。 |
* 如果由`start`和`length`计算得出的字符串长度超过了string的最末端,则截取到最末端即结束。
* 如果`start`或者`length`,那么会去除小数部分取整数部分。
* 如果两个参数有字符串,则会先进行parseInt(),如果转换结果为`NaN`,则会转换为0。
> ECMAscript 没有对该方法进行标准化,所以不建议使用该方法。
#### 总结
* `slice()`与`substring()`的两个参数都是下标,但两者参数对于参数为负数的处理不一样。`substring()`永远都是小的参数作为`start`,但`slice()`永远都是第一个参数作为`start`。
* `substr()`对负数的处理同`slice()`,但`slice()`的第二个参数是`length`,表示要截取的字符串的长度。
![[20210422] js截取字符串 - slice(), substring(), substr() 区别](https://image.hyzed.cn/blog/e351f31c1206b637d789b3b1441de6fd.jpg)
[20210422] js截取字符串 - slice(), substring(), substr() 区别