写在前面
slice()
和 substring(
) 这两个方法都可以截取字符串,那么为什么会设计这两个 API 呢?
二者的区别
substring()
和 slice()
方法几乎是相同的,但两者之间有一些微妙的区别,特别是在处理负参数的方式上。
如果 indexStart
大于 indexEnd
,substring()
方法会交换两个参数,这意味着仍然会返回一个字符串。但是 slice()
方法面对这种情况会返回一个空字符串。
let text = 'Mozilla'
console.log(text.substring(5, 2)) // => "zil"
console.log(text.slice(5, 2)) // => ""
如果参数中的一个或两个都是负数或 NaN
,则 substring()
将它们当作 0 处理。
console.log(text.substring(-5, 2)) // => "Mo"
console.log(text.substring(-5, -2)) // => ""
slice()
也将 NaN
参数视为 0,但当它为负时,它会从字符串的末尾向前数,以找到索引。
console.log(text.slice(-5, 2)) // => ""
console.log(text.slice(-5, -2)) // => "zil"
共存的原因
乍一看 slice()
和 substring()
做的是同样的事情,但最大的区别在于它们如何处理负参数。
当 Netscape 2.0 首次实现 JavaScript 时,只有一个 substring()
方法。如果它的任何一个参数是负数,就会被当作 0 处理。
当 Netscape 4.0 引入 JavaScript 1.2 后,他们希望通过支持负索引来从反向遍历字符串。不过不能修改 substring()
的行为 ,因为这会破坏现有的代码的兼容性,所以只能创建一个新的函数来支持新增的功能。这个函数就是 slice()
,在 Array
和 String
上都实现了。