String.prototype.split()

split() 方法String值接受一个模式并将此字符串拆分为一个有序的子字符串列表,方法是搜索模式,将这些子字符串放入数组中,并返回该数组。

试试看

语法

js
split(separator)
split(separator, limit)

参数

分隔符

描述每个拆分应该发生位置的模式。可以是undefined、字符串或带有 Symbol.split 方法的对象——典型的例子是正则表达式。省略分隔符或传递undefined会导致split()返回一个包含调用字符串作为单个元素的数组。所有不是undefined或带有[Symbol.split]()方法的对象的值都将强制转换为字符串

limit 可选

一个非负整数,指定要包含在数组中的子字符串数量的限制。如果提供,则在指定的分隔符的每个出现位置拆分字符串,但当数组中放置了limit个条目时停止。任何剩余的文本都不会包含在数组中。

  • 如果在达到限制之前到达字符串的末尾,则数组可能包含的条目少于limit
  • 如果limit0,则返回[]

返回值

一个Array字符串,在给定字符串中分隔符出现的每个位置拆分。

描述

如果分隔符是一个非空字符串,则目标字符串将被分隔符的所有匹配项拆分,而不包括结果中的分隔符。例如,包含制表符分隔值 (TSV) 的字符串可以通过传递制表符作为分隔符来解析,例如myString.split("\t")。如果分隔符包含多个字符,则必须找到整个字符序列才能进行拆分。如果分隔符出现在字符串的开头(或结尾),它仍然会产生拆分效果,导致一个空(即零长度)字符串出现在返回数组的第一个(或最后一个)位置。如果分隔符没有出现在str中,则返回的数组包含一个由整个字符串组成的元素。

如果分隔符是一个空字符串(""),则str将转换为其每个 UTF-16 "字符" 的数组,在结果字符串的两端都没有空字符串。

注意:因此,"".split("")是在字符串作为分隔符传递且limit不为0时产生空数组的唯一方法。

警告: 当使用空字符串 ("") 作为分隔符时,字符串不会根据用户感知字符 (字形簇) 或 Unicode 字符(代码点)进行分割,而是根据 UTF-16 代码单元进行分割。这会破坏代理对。请参见StackOverflow 上的“如何在 JavaScript 中将字符串转换为字符数组?”

如果separator是一个匹配空字符串的正则表达式,那么分割是根据 UTF-16 代码单元还是 Unicode 代码点进行,取决于该正则表达式是否支持 Unicode

js
"😄😄".split(/(?:)/); // [ "\ud83d", "\ude04", "\ud83d", "\ude04" ]
"😄😄".split(/(?:)/u); // [ "😄", "😄" ]

如果separator是一个包含捕获组的正则表达式,那么每次separator匹配时,捕获的组(包括任何undefined结果)都会被插入到输出数组中。此行为由正则表达式的Symbol.split 方法指定。

如果separator是一个带有Symbol.split 方法的对象,则该方法会使用目标字符串和limit作为参数调用,并将this设置为该对象。它的返回值将成为split的返回值。

任何其他值在用作分隔符之前都会被强制转换为字符串。

示例

使用 split()

当字符串为空且指定了非空分隔符时,split() 返回[""]。如果字符串和分隔符都是空字符串,则返回一个空数组。

js
const emptyString = "";

// string is empty and separator is non-empty
console.log(emptyString.split("a"));
// [""]

// string and separator are both empty strings
console.log(emptyString.split(emptyString));
// []

以下示例定义了一个函数,该函数使用separator将字符串分割成字符串数组。分割字符串后,该函数会记录消息,指示原始字符串(分割前)、使用的分隔符、数组中的元素数量以及各个数组元素。

js
function splitString(stringToSplit, separator) {
  const arrayOfStrings = stringToSplit.split(separator);

  console.log("The original string is:", stringToSplit);
  console.log("The separator is:", separator);
  console.log(
    "The array has",
    arrayOfStrings.length,
    "elements:",
    arrayOfStrings.join(" / "),
  );
}

const tempestString = "Oh brave new world that has such people in it.";
const monthString = "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec";

const space = " ";
const comma = ",";

splitString(tempestString, space);
splitString(tempestString);
splitString(monthString, comma);

此示例产生以下输出

The original string is: "Oh brave new world that has such people in it."
The separator is: " "
The array has 10 elements: Oh / brave / new / world / that / has / such / people / in / it.

The original string is: "Oh brave new world that has such people in it."
The separator is: "undefined"
The array has 1 elements: Oh brave new world that has such people in it.

The original string is: "Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec"
The separator is: ","
The array has 12 elements: Jan / Feb / Mar / Apr / May / Jun / Jul / Aug / Sep / Oct / Nov / Dec

从字符串中删除空格

在以下示例中,split() 查找零个或多个空格,后跟一个分号,再后跟零个或多个空格——找到后,会从字符串中删除空格和分号。nameList 是由于split() 返回的数组。

js
const names = "Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand ";

console.log(names);

const re = /\s*(?:;|$)\s*/;
const nameList = names.split(re);

console.log(nameList);

这会记录两行;第一行记录原始字符串,第二行记录生成的数组。

Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand
[ "Harry Trump", "Fred Barney", "Helen Rigby", "Bill Abel", "Chris Hand", "" ]

返回有限数量的分割

在以下示例中,split() 在字符串中查找空格,并返回它找到的前 3 个分割。

js
const myString = "Hello World. How are you doing?";
const splits = myString.split(" ", 3);

console.log(splits); // [ "Hello", "World.", "How" ]

使用RegExp 进行分割,以在结果中包含分隔符的部分

如果separator是一个包含捕获圆括号 ( ) 的正则表达式,则匹配的结果将被包含在数组中。

js
const myString = "Hello 1 word. Sentence number 2.";
const splits = myString.split(/(\d)/);

console.log(splits);
// [ "Hello ", "1", " word. Sentence number ", "2", "." ]

注意: \d 匹配字符类 中介于 0 和 9 之间的数字。

使用自定义分隔符

带有Symbol.split 方法的对象可以用作具有自定义行为的分隔符。

以下示例使用一个由递增数字组成的内部状态来分割字符串

js
const splitByNumber = {
  [Symbol.split](str) {
    let num = 1;
    let pos = 0;
    const result = [];
    while (pos < str.length) {
      const matchPos = str.indexOf(num, pos);
      if (matchPos === -1) {
        result.push(str.substring(pos));
        break;
      }
      result.push(str.substring(pos, matchPos));
      pos = matchPos + String(num).length;
      num++;
    }
    return result;
  },
};

const myString = "a1bc2c5d3e4f";
console.log(myString.split(splitByNumber)); // [ "a", "bc", "c5d", "e", "f" ]

以下示例使用内部状态来强制执行某些行为,并确保生成“有效”的结果。

js
const DELIMITER = ";";

// Split the commands, but remove any invalid or unnecessary values.
const splitCommands = {
  [Symbol.split](str, lim) {
    const results = [];
    const state = {
      on: false,
      brightness: {
        current: 2,
        min: 1,
        max: 3,
      },
    };
    let pos = 0;
    let matchPos = str.indexOf(DELIMITER, pos);

    while (matchPos !== -1) {
      const subString = str.slice(pos, matchPos).trim();

      switch (subString) {
        case "light on":
          // If the `on` state is already true, do nothing.
          if (!state.on) {
            state.on = true;
            results.push(subString);
          }
          break;

        case "light off":
          // If the `on` state is already false, do nothing.
          if (state.on) {
            state.on = false;
            results.push(subString);
          }
          break;

        case "brightness up":
          // Enforce a brightness maximum.
          if (state.brightness.current < state.brightness.max) {
            state.brightness.current += 1;
            results.push(subString);
          }
          break;

        case "brightness down":
          // Enforce a brightness minimum.
          if (state.brightness.current > state.brightness.min) {
            state.brightness.current -= 1;
            results.push(subString);
          }
          break;
      }

      if (results.length === lim) {
        break;
      }

      pos = matchPos + DELIMITER.length;
      matchPos = str.indexOf(DELIMITER, pos);
    }

    // If we broke early due to reaching the split `lim`, don't add the remaining commands.
    if (results.length < lim) {
      results.push(str.slice(pos).trim());
    }

    return results;
  },
};

const commands =
  "light on; brightness up; brightness up; brightness up; light on; brightness down; brightness down; light off";
console.log(commands.split(splitCommands, 3)); // ["light on", "brightness up", "brightness down"]

规范

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

浏览器兼容性

BCD 表仅在浏览器中加载

另请参见