【问题标题】:What is the difference between substr and substring?substr 和 substring 有什么区别?
【发布时间】:2018-08-13 15:54:03
【问题描述】:

有什么区别

alert("abc".substr(0,2));

alert("abc".substring(0,2));

他们似乎都输出“ab”。

【问题讨论】:

  • 注意,substring 最近在 Chrome 上的表现优于所有其他人(根据现已解散的 jsperf.com)。
  • 添加到@Derek 评论...与slice 方法不同,substring 不处理负参数的调整。
  • 我认为更重要的问题是“为什么 JavaScript 同时具有 substr 方法和 substring 方法”?这真的是首选的重载方法吗?
  • 截至今天,MDN 在此处的文档页面顶部有一个关于substr() 可能被称为“伪弃用”的红色警告:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - 有人有更多信息吗关于这个,例如是否有任何浏览器计划在未来的任何时候实际弃用substr()?或者正如 Steven Lu 所建议的那样,使用substr() 会不会有性能劣势?
  • @codekandis 它在底部表格中:i.imgur.com/BHkYWHA.png

标签: javascript substring


【解决方案1】:

区别在于第二个参数。 substring 的第二个参数是要停止的索引(但不包括),但 substr 的第二个参数是要返回的最大长度。

链接?

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substring

【讨论】:

  • 听起来是一个常见的错误来源。很高兴知道其中的区别。在此处找到有关此的其他 cmets:rapd.wordpress.com/2007/07/12/javascript-substr-vs-substring
  • @Pawel 当你想要它到字符串的末尾时(没有第二个参数)
  • 您还应该提到第一个参数的差异,它对于 substr 可能是负数(在这种情况下它从末尾开始),但对于 substring 则不是。请参阅 JefferMC 的回答,但它的票数太少,以至于很多人可能会错过这个重要部分。
  • 由于这是迄今为止最受好评的答案,因此可能应该对其进行编辑以包括 String.prototype.substr() 已弃用...(它在 ECMA-262 标准的 Annex B 中定义,其introduction 声明:“……程序员在编写新的 ECMAScript 代码时不应使用或假设存在这些特性和行为。……”)
  • substr 处理负起始值,而 substring 不处理:"Hello".substr(-2); // return "lo" "Hello".substring(-2); // return "Hello"
【解决方案2】:

substr (MDN) 将参数作为(from, length)
substring (MDN) 将参数作为(from, to)

更新:MDN 认为substr 遗留。

alert("abc".substr(1,2)); // returns "bc"
alert("abc".substring(1,2)); // returns "b"

您可以记住substr<b>i</b>ng(带有 i)采用 indices,另一种字符串提取方法 slice 也是如此(带有 i)。

从 0 开始时,您可以使用任一方法。

【讨论】:

  • .substring() 获取索引。您可以记住,因为它是唯一一个名称中带有“i”的名称。 .slice() 也接受索引。
  • @colllin,关于 i 和 indicies 的评论肯定应该移到答案中!
【解决方案3】:

正如 yatima2975 的回答中所暗示的,还有一个不同之处:

substr() 接受负的起始位置作为距字符串末尾的偏移量。 substring() 没有。

来自MDN

如果 start 为负数,substr() 将其用作从 字符串的结尾。

所以总结一下功能上的区别:

substring(begin-offset, end-offset-exclusive) 其中 begin-offset 为 0 或更大

substr(begin-offset, length) 其中 begin-offset 也可能为负数

【讨论】:

    【解决方案4】:

    主要区别在于

    substr() 允许你指定返回的最大长度

    substring() 允许你指定索引并且第二个参数不包含

    在 substr() 和 substring() 之间还有一些额外的微妙之处,例如处理相等参数和否定参数。另请注意 substring() 和 slice() 相似但并不总是相同。

      //*** length vs indices:
        "string".substring(2,4);  // "ri"   (start, end) indices / second value is NOT inclusive
        "string".substr(2,4);     // "ring" (start, length) length is the maximum length to return
        "string".slice(2,4);      // "ri"   (start, end) indices / second value is NOT inclusive
    
      //*** watch out for substring swap:
        "string".substring(3,2);  // "r"    (swaps the larger and the smaller number)
        "string".substr(3,2);     // "in"
        "string".slice(3,2);      // ""     (just returns "")
    
      //*** negative second argument:
        "string".substring(2,-4); // "st"   (converts negative numbers to 0, then swaps first and second position)
        "string".substr(2,-4);    // ""
        "string".slice(2,-4);     // ""
    
      //*** negative first argument:
        "string".substring(-3);   // "string"        
        "string".substr(-3);      // "ing"  (read from end of string)
        "string".slice(-3);       // "ing"        
    

    【讨论】:

    • 您错过了slice 有用的“第二个否定论点”:"string".slice(2,-2); // "ri"
    【解决方案5】:

    我最近遇到的另一个问题是,在 IE 8 中,"abcd".substr(-1) 错误地返回 "abcd",而 Firefox 3.6 则返回 "d"slice 在两者上都能正常工作。

    更多关于这个话题的信息可以在here找到。

    【讨论】:

      【解决方案6】:

      最大的区别在于,substr()已弃用的方法,仍然可以使用,但应谨慎使用,因为预计它们将在未来某个时候完全删除。您应该努力从代码中删除它们的使用。并且substring()方法成功,并指定了前者。

      【讨论】:

      • 您能否指出一个可靠的来源表明 substr() 已被弃用?我从几个人那里读过它,但我在网上找不到任何支持该声明的信息。另外,Mozilla 并未将其包含在已弃用/过时的功能列表中:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
      • @DanielM 据我记得,当我发布这个答案时,它已被弃用,也许文章已更改,现在未弃用 (但不确定).. 但仍然记录在一些文章中,例如 sstut.com/javascript/substring-method.php 已弃用。
      • @DanielM String.prototype.substr() 在 ECMA-262 标准的 Annex B 中定义,其 introduction 声明:“……程序员在编写新的代码时不应使用或假设存在这些特性和行为ECMAScript 代码。..."
      • @TS substr() 在某些文档中确实被标记为已弃用。
      • 这应该是今天公认的答案。在有替代方案时使用遗留函数不是好的代码的选择。请对此答案投赞成票,以使其在 Google 指向此页面时更加明显。
      【解决方案7】:

      区别在于第二个参数。他们的第二个参数,虽然都是数字,但期待两个不同的东西:

      使用子字符串时,第二个参数是第一个不包含的索引:

      var s = "string";
      s.substring(1, 3); // would return 'tr'
      
      var s = "another example";
      s.substring(3, 7); // would return 'ther'
      

      使用 substr 时,第二个参数是要包含在子字符串中的字符数:

      var s = "string";
      s.substr(1, 3); // would return 'tri'
      
      var s = "another example";
      s.substr(3, 7); // would return 'ther ex'
      

      【讨论】:

        【解决方案8】:

        子字符串(): 它有 2 个参数“开始”和“结束”。

        • start 参数是必需的,指定开始的位置 提取。
        • end 参数是可选的,它指定了 提取应该结束。

        如果不指定end参数,则提取从开始位置到字符串结尾的所有字符。

        var str = "Substring Example";
        var result = str.substring(0, 10);
        alert(result);
        
        Output : Substring

        如果开始参数的值大于结束参数的值,此方法将交换两个参数。这意味着 start 将用作 end,end 将用作 start。

        var str = "Substring Example";
        var result = str.substring(10, 0);
        alert(result);
        
        Output : Substring

        substr():它有两个参数“start”和“count”。

        • start 参数是必需的,指定开始的位置 提取。

        • count 参数是可选的,它指定要输入的字符数 提取。

        var str = "Substr Example";
        var result = str.substr(0, 10);
        alert(result);
        
        
        Output : Substr Exa

        如果不指定count参数,则提取字符串从开始位置到结尾的所有字符。如果 count 为 0 或负数,则返回一个空字符串。

        var str = "Substr Example";
        var result = str.substr(11);
        alert(result);
        
        Output : ple

        【讨论】:

          【解决方案9】:

          substring(startIndex, endIndex(不包括))

          substr(startIndex, 多少个字符)

          const string = 'JavaScript';
          
          console.log('substring(1,2)', string.substring(1,2)); // a
          console.log('substr(1,2)', string.substr(1,2)); // av
          

          【讨论】:

            【解决方案10】:
            let str = "Hello World"
            
            console.log(str.substring(1, 3))  // el -> Excludes the last index
            console.log(str.substr(1, 3))  // ell -> Includes the last index
            

            【讨论】:

              【解决方案11】:

              下面是 substr() 和 substring() 的主要区别:

              1. substr() 有参数 start 和 stop 而 substring 作为参数 first 和 last。

                substr(x, start, stop)

              substring(text, first, last = 1000000L)
              

              示例

              substr("abcdef", start = 2, stop=4)
              [1] "bcd"
              
              substring("abcdef", first = 2, last = 4)    
              [1] "bcd"
              
              1. substring 函数的 'last' 参数的默认值 [1000000L] 很大,因此您可以跳过指定,而 substr 函数需要您指定 stop 参数的值。

              示例

              substr("abcdef", start = 2)
              Error in substr("abcdef", start = 2) : 
                argument "stop" is missing, with no default
              
              substring("abcdef", first = 2)
              [1] "bcdef"
              
              1. 如果您将 substr 函数应用于多个起点或终点,该函数仅使用第一个条目(即终点 1),而 substring 函数将提取几个可能的字符串。

              示例

              > substr('abcdef', 1:3, 5)
              [1] "abcde"
              > substr('abcdef', 1:3, 5:6)
              [1] "abcde"
              > substr('abcdef', 1, 5:6)
              [1] "abcde"
              > substring('abcdef', 1:3, 5)
              [1] "abcde" "bcde"  "cde"  
              > substring('abcdef', 1, 5:6)
              [1] "abcde"  "abcdef"
              > substring('abcdef', 1:3, 5:6)
              [1] "abcde" "bcdef" "cde"  
              

              有人提到使用负索引/零。 两者都被 substr() 和 substring() 接受。

              示例

              > substr('abcdef', -2, 3)
              [1] "abc"
              > substring('abcdef', -2, 3)
              [1] "abc"
              > substring('abcdef', 0, 3)
              [1] "abc"
              > substr('abcdef', 0, 3)
              [1] "abc"
              

              使用 substr() 或 substring() 进行字符串替换的重要说明

              替换部分的字符数必须与数据中被替换部分的字符数相同。 如果你想用不同长度的字符串替换子字符串,你可以看看 gsub() 函数。

              附:我正在使用 R 版本 4.0.4

              【讨论】:

                猜你喜欢
                • 2012-04-24
                • 1970-01-01
                • 2011-05-31
                • 2011-09-28
                • 2012-10-18
                • 2017-10-01
                • 1970-01-01
                • 2010-10-02
                相关资源
                最近更新 更多