【问题标题】:What is the difference between String.slice and String.substring?String.slice 和 String.substring 有什么区别?
【发布时间】:2011-01-15 16:11:50
【问题描述】:

有人知道这两种方法有什么区别吗?

String.prototype.slice
String.prototype.substring

【问题讨论】:

  • 这是一个糟糕的 JavaScript 设计示例,我们最终得到了三种方法,它们都做同样的事情,但有不同的怪癖。 IMO slice 是最不意外的行为。
  • IMO 子字符串用于从 idx 到结尾的子字符串一目了然。特别是对于菜鸟
  • 根据this websiteslice实际上可以替代substring,没有理由使用它。
  • @AmolMKulkarni 完全不正确。如果您尝试var a = "asdf".substring(-1);,它将被视为var a = "asdf".substring(0);。没有抛出异常。如果你使用var a = "asdf".substring(2, -1);,它会使用0 代替-1(和以前一样),并交换参数,使其行为类似于var a = "asdf".substring(0, 2);。我什至在 IE 8 上尝试了这些,并且毫无例外地得到了结果
  • “我什至在 IE 8 上试过这些”——我喜欢编程。

标签: javascript substring slice substr


【解决方案1】:

TL;DR;

  • 如果您知道要停止(但不包括)的索引(位置),请使用slice()
  • 如果您知道要提取的字符长度,请使用substr()

否则,请继续阅读以进行完整比较

语法

  • string.slice(start,end)
  • string.substr(start,length)
  • string.substring(start,end)

注意#1slice()==substring()

它有什么作用?

  • slice() 方法提取字符串的一部分并在新字符串中返回提取的部分。
  • substr() 方法从指定位置的字符开始提取字符串的一部分,并返回指定数量的字符。
  • substring() 方法提取字符串的一部分并在新字符串中返回提取的部分。

注意#2slice()==substring()

更改原始字符串?

  • slice() 没有
  • substr() 没有
  • substring() 没有 注意#3slice()==substring()

使用负数作为参数

  • slice() 选择从字符串末尾开始的字符
  • substr()选择从字符串末尾开始的字符
  • substring() 不执行

注意#3slice()==substr()

如果第一个参数大于第二个

  • slice() 不执行
  • substr() 因为第二个参数不是位置,而是长度值,它会照常执行,没有问题
  • substring() 将交换两个参数,并照常执行

第一个参数

  • slice() 必填,表示:起始索引
  • substr() 必填,表示:起始索引
  • substring() 必填,表示:起始索引

注意#4slice()==substr()==substring()

第二个论证

  • slice() 可选,结束提取的位置(最多但不包括)
  • substr() 可选,要提取的字符数
  • substring() 可选,结束提取的位置(最多但不包括)

注意#5slice()==substring()

如果省略第二个参数怎么办?

  • slice() 选择从开始位置到字符串结尾的所有字符
  • substr() 选择从开始位置到字符串结尾的所有字符
  • substring() 选择从开始位置到字符串结尾的所有字符

注意#6slice()==substr()==substring()

所以,您可以说slice()substr() 之间存在区别,而substring() 基本上是slice() 的副本。

【讨论】:

【解决方案2】:

substringslice 之间的区别 - 是它们如何处理否定和忽略国外参数的行:

子字符串(开始,结束)

负参数被解释为零。太大的值被截断到字符串的长度:

alert("testme".substring(-2)); // "testme", -2 becomes 0

此外,如果start > end,则参数互换,即绘图线在开始和结束之间返回:

alert("testme".substring(4, -1)); // "test"
// -1 Becomes 0 -> got substring (4, 0)
// 4> 0, so that the arguments are swapped -> substring (0, 4) = "test"

切片

负值从行尾开始测量:

alert("testme".slice(-2)); // "me", from the end position 2
alert("testme".slice(1, -1)); // "estm", from the first position to the one at the end.

比奇怪的逻辑substring方便多了。

除IE8-之外的所有浏览器都支持substr的第一个参数的负值。

如果选择这三种方法中的一种,在大多数情况下使用 - 它将是slice:否定参数,并且它的维护和操作最明显。

【讨论】:

    【解决方案3】:

    Ben Nadel 写了一篇很好的文章,他指出了这些函数的参数差异:

    String.slice( begin [, end ] )
    String.substring( from [, to ] )
    String.substr( start [, length ] )
    

    他还指出,如果要切片的参数为负数,它们会从末尾引用字符串。 substring 和 substr 没有。

    Here is his article 关于这个。

    【讨论】:

    • 这是不正确的,substr 确实处理负参数。 '0123456789'.substr(-3, 2) -> '78'
    • 关于来自 mdn 的 substr "已弃用。不适用于新网站。"
    【解决方案4】:

    substr:它让我们可以根据指定的索引获取部分字符串。 substr-的语法 string.substr(开始,结束) start - 开始索引告诉获取开始的位置。 end - 结束索引告诉字符串获取的位置。这是可选的。

    slice:它提供基于指定索引获取部分字符串。它允许我们指定正数和索引。 切片的语法 - string.slice(start,end) start - 开始索引告诉获取开始的位置。它是 end - 结束索引告诉字符串获取的位置。这是可选的。 在“拼接”中,开始和结束索引都有助于获取正负索引。

    字符串中'slice'的示例代码

    var str="Javascript";
    console.log(str.slice(-5,-1));
    
    output: crip
    

    字符串中“子字符串”的示例代码

    var str="Javascript";
    console.log(str.substring(1,5));
    
    output: avas
    

    [*注意:负索引从字符串的末尾开始。]

    【讨论】:

    • 你写的是错误的,与问题无关。 substr() 是一个不同的函数,它没有参数“开始,停止”,因为您在答案中错误地陈述:它有参数“开始,长度”。但问题根本不是关于 substr()!幸运的是,在 9 年前已经给出了正确而完整的答案……
    【解决方案5】:

    对于slice(start, stop),如果stop 为负数,stop 将设置为:

    string.length – Math.abs(stop)
    

    而不是:

    string.length – 1 – Math.abs(stop)
    

    【讨论】:

      【解决方案6】:

      slice() 的工作方式与 substring() 类似,但有一些不同的行为。

      Syntax: string.slice(start, stop);
      Syntax: string.substring(start, stop);
      

      它们的共同点:

      1. 如果start 等于stop:返回一个空字符串
      2. 如果省略stop:将字符提取到字符串的末尾
      3. 如果任一参数大于字符串的长度,则将使用字符串的长度。

      区别substring()

      1. 如果start > stop,则substring 将交换这两个参数。
      2. 如果任一参数为负数或NaN,则将其视为0

      区别slice()

      1. 如果start > stopslice() 将返回空字符串。 ("")
      2. 如果start 为负数:从字符串末尾设置char,与Firefox 中的substr() 完全相同。在 Firefox 和 IE 中都可以观察到这种行为。
      3. 如果stop 为负数:将停止设置为:string.length – Math.abs(stop)(原始值),但在ECMA specification 中涵盖的范围为0(因此,Math.max(0, string.length + stop))除外。

      来源:Rudimentary Art of Programming & Development: Javascript: substr() v.s. substring()

      【讨论】:

      • 在您对slice() 的最后一条注释中,应该是string.length - stop
      • 在你关于slice() 的最后一条注释中,我认为应该是(string.length – 1) + stop,或者,为了明确表示它是否定的,(string.length – 1) – Math.abs(stop)
      • @Longpoke: String.slice 被添加以便有一个与Array.slice 一致的字符串方法。 substring 一直存在,所以他们没有破坏它并添加了另一种方法。几乎不是一个糟糕的决定,因为 1. 一致性很好 2. 它允许 CoffeeScript 的切片语法在数组和字符串上工作。 @Oriol:编辑它。
      • 在 Firefox 22 中子字符串和切片之间似乎存在性能差异。jsperf.com/string-slice-vs-substring
      • 安迪是对的。如果stop 为负数,stop 将设置为string.length + stop。记住stop 是提取最后一个字符后的索引!
      【解决方案7】:

      一个答案很好,但需要一点阅读。尤其是新的术语“停止”。

      我的 Go - 除了上面 Daniel 的第一个答案之外,还按差异组织以使其有用:

      1) 负索引。子字符串需要正索引,并且会将负索引设置为 0。切片的负索引表示从字符串末尾开始的位置。

      "1234".substring(-2, -1) == "1234".substring(0,0) == ""
      "1234".slice(-2, -1) == "1234".slice(2, 3) == "3"
      

      2) 交换索引。子字符串会对索引进行重新排序,使第一个索引小于或等于第二个索引。

      "1234".substring(3,2) == "1234".substring(2,3) == "3"
      "1234".slice(3,2) == ""
      

      --------------

      一般评论——我觉得奇怪的是第二个索引是切片或子字符串的最后一个字符之后的位置。我希望“1234”.slice(2,2) 返回“3”。这使得安迪的困惑是有道理的——我希望“1234”.slice(2, -1) 返回“34”。是的,这意味着我是 Javascript 新手。这也意味着这种行为:

      "1234".slice(-2, -2) == "", "1234".slice(-2, -1) == "3", "1234".slice(-2, -0) == "" <-- you have to use length or omit the argument to get the 4.
      "1234".slice(3, -2) == "", "1234".slice(3, -1) == "", "1234".slice(3, -0) == "" <-- same issue, but seems weirder.
      

      我的 2c。

      【讨论】:

        【解决方案8】:

        切片和子字符串方法的唯一区别是参数

        两者都有两个参数,例如开始/从和结束/到。

        您不能将负值作为 substring 方法的第一个参数传递,而是 slice 方法从末尾遍历它。

        切片方法参数详情:

        参考: http://www.thesstech.com/javascript/string_slice_method

        参数

        开始索引 切片应该开始的索引。如果提供的值为负数,则表示从最后一个开始。例如-1 表示最后一个字符。 end_index 切片结束后的索引。如果未提供切片,将从 start_index 到字符串结尾。如果是负值,索引将从字符串末尾开始计算。

        子字符串方法参数详情:

        参考号:http://www.thesstech.com/javascript/string_substring_method

        参数

        来自 它应该是一个非负整数来指定子字符串应该从哪里开始的索引。 一个可选的非负整数,用于提供索引,在该索引之前应该完成子字符串。

        【讨论】:

          猜你喜欢
          • 2013-03-08
          • 2010-10-02
          • 2011-12-12
          • 2010-09-16
          • 2012-03-14
          • 2012-02-06
          • 2011-02-25
          相关资源
          最近更新 更多