String.prototype.substring()

substring()String 值的一个方法,它返回该字符串从起始索引到(不包括)结束索引的部分,或者如果未提供结束索引,则返回到字符串的末尾。

试一试

语法

js
substring(indexStart)
substring(indexStart, indexEnd)

参数

indexStart

要包含在返回的子字符串中的第一个字符的索引。

indexEnd 可选

要从返回的子字符串中排除的第一个字符的索引。

返回值

一个新的字符串,包含给定字符串的指定部分。

描述

substring()indexStart 提取字符到 但不包括 indexEnd。特别是

  • 如果省略了 indexEnd,则 substring() 会提取到字符串末尾的字符。
  • 如果 indexStart 等于 indexEnd,则 substring() 返回空字符串。
  • 如果 indexStart 大于 indexEnd,则 substring() 的效果就像交换了这两个参数一样;请参阅下面的示例。

任何小于 0 或大于 str.length 的参数值都将被视为 0str.length

任何参数值为 NaN 的都将被视为 0

示例

使用 substring()

以下示例使用 substring() 来显示字符串 "Mozilla" 中的字符

js
const anyString = "Mozilla";

console.log(anyString.substring(0, 1)); // "M"
console.log(anyString.substring(1, 0)); // "M"

console.log(anyString.substring(0, 6)); // "Mozill"

console.log(anyString.substring(4)); // "lla"
console.log(anyString.substring(4, 7)); // "lla"
console.log(anyString.substring(7, 4)); // "lla"

console.log(anyString.substring(0, 7)); // "Mozilla"
console.log(anyString.substring(0, 10)); // "Mozilla"

将 substring() 与 length 属性一起使用

以下示例使用 substring() 方法和 length 属性来提取特定字符串的最后几个字符。鉴于您不需要像上述示例那样知道起始和结束索引,此方法可能更容易记住。

js
const text = "Mozilla";

// Takes 4 last characters of string
console.log(text.substring(text.length - 4)); // prints "illa"

// Takes 5 last characters of string
console.log(text.substring(text.length - 5)); // prints "zilla"

substring() 和 substr() 之间的区别

substring()substr() 方法之间存在细微差别,因此您应该注意不要将它们混淆。

  • substr() 的两个参数是 startlength,而对于 substring(),它们是 startend
  • 如果 substr()start 索引为负数,它将环绕到字符串的末尾,而 substring() 将将其钳位到 0
  • substr() 中的负长度将被视为零,而 substring() 如果 end 小于 start,则会交换这两个索引。

此外,substr() 被认为是 ECMAScript 中的遗留特性,因此最好避免在可能的情况下使用它。

js
const text = "Mozilla";
console.log(text.substring(2, 5)); // "zil"
console.log(text.substr(2, 3)); // "zil"

substring() 和 slice() 之间的区别

substring()slice() 方法几乎相同,但在两者之间存在一些细微差别,尤其是在处理负参数的方式上。

如果 indexStart 大于 indexEnd,则 substring() 方法会交换其两个参数,这意味着仍然会返回一个字符串。如果出现这种情况,则 slice() 方法会返回一个空字符串。

js
const text = "Mozilla";
console.log(text.substring(5, 2)); // "zil"
console.log(text.slice(5, 2)); // ""

如果一个或两个参数为负数或 NaN,则 substring() 方法将它们视为 0

js
console.log(text.substring(-5, 2)); // "Mo"
console.log(text.substring(-5, -2)); // ""

slice() 也将 NaN 参数视为 0,但当它获得负值时,它会从字符串末尾反向计数以查找索引。

js
console.log(text.slice(-5, 2)); // ""
console.log(text.slice(-5, -2)); // "zil"

有关带负数的更多示例,请参阅 slice() 页面。

替换字符串中的子字符串

以下示例演示了如何在字符串中替换子字符串。它可以替换单个字符和子字符串。示例末尾的函数调用从原始字符串 Brave New World 创建了一个字符串 Brave New Web

js
// Replaces oldS with newS in the string fullS
function replaceString(oldS, newS, fullS) {
  for (let i = 0; i < fullS.length; ++i) {
    if (fullS.substring(i, i + oldS.length) === oldS) {
      fullS =
        fullS.substring(0, i) +
        newS +
        fullS.substring(i + oldS.length, fullS.length);
    }
  }
  return fullS;
}

replaceString("World", "Web", "Brave New World");

请注意,如果 oldS 本身是 newS 的子字符串,则可能会导致无限循环——例如,如果您尝试在此处将 "World" 替换为 "OtherWorld"

替换字符串的更好方法如下所示

js
function replaceString(oldS, newS, fullS) {
  return fullS.split(oldS).join(newS);
}

以上代码用作子字符串操作的示例。如果您需要替换子字符串,大多数情况下您会想要使用 String.prototype.replace()

规范

规范
ECMAScript 语言规范
# sec-string.prototype.substring

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅