ChatGPT解决这个技术问题 Extra ChatGPT

substr 和 substring 有什么区别?

和有什么区别

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

N
NullPointerException

区别在于第二个论点。 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


听起来像是一个常见的错误来源。很高兴知道其中的区别。在此处找到关于此的其他评论: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"
H
Hasan Sefa Ozalp

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

更新:MDN 考虑 substr 旧版。

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

您可以记住 substring(带有 i)需要 indices,另一种字符串提取方法 slice(带有)。

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


.substring() 采用索引。您可以记住,因为它是唯一一个名称中带有“i”的名称。 .slice() 也采用索引。
@colllin,关于 i 和 indicies 的评论肯定应该移到答案中!
只为助记符投票
2
2540625

正如 yatima2975 的回答所暗示的,还有一个额外的区别:

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

MDN

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

所以总结一下功能差异:

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

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


S
S.Serpooshan

主要区别在于

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"
y
yatima2975

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

有关此主题的更多信息,请参阅 here


5
5ervant - techintel.github.io

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


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

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

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

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'

r
raju poloju

substring():它有 2 个参数“start”和“end”。

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

end 参数是可选的,它指定提取应该结束的位置。

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

var str = "子字符串示例"; var 结果 = str.substring(0, 10);警报(结果);输出:子字符串

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

var str = "子字符串示例"; var 结果 = str.substring(10, 0);警报(结果);输出:子字符串

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

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

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

var str = "子字符串示例"; var 结果 = str.substr(0, 10);警报(结果);输出:Substr Exa

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

var str = "子字符串示例"; var 结果 = str.substr(11);警报(结果);输出:ple


S
Sajith Mantharath

子字符串(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

G
Gaurav
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

D
Dr Nisha Arora

编辑:这个答案是参考 R 编程

以下是 substr() 和 substring() 之间的主要区别:

substr() 有参数 start 和 stop 而 substring 作为参数 first 和 last。 substr(x, 开始, 停止)

substring(text, first, last = 1000000L)

例子

substr("abcdef", start = 2, stop=4)
[1] "bcd"

substring("abcdef", first = 2, last = 4)    
[1] "bcd"

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"

如果您将 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() 函数。

PS 我使用的是 R 版本 4.0.4


对于负数,此答案错误,因为它们的处理方式不同。 substr(-2) 将从字符串末尾的位置 -2 开始,返回最后两个字符。 substring所有负数 转换为零或字符串长度。因此 substring(-2) 将转换为 substring(0) 返回整个字符串。 MDN:Any argument value that is less than 0 or greater than stringName.length is treated as if it were 0 and stringName.length, respectively.
@米歇尔。我没有注意到标签 #javascript 并回答了它在 R 中的工作原理,但我的笔记清楚地提到我正在为 R 提供代码和解释。