substr和substring有什么区别?


843

之间有什么区别

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

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

他们似乎都输出“ ab”。


13
@Derek朕会功夫注意,最近substring 在Chrome上的表现优于其他所有工具
史蒂文·卢

4
添加到@Derek注释...与slice方法不同,substring它不处理负参数的调整。
Dzeimsas Zvirblis

1
我认为更重要的问题是“为什么JavaScript既有substr方法又有substring方法”?这真的是首选的重载方法吗?
Sinjai

7
截至今天,MDN substr()在此处的文档页面顶部发出了一个红色大警告,警告您可能被称为“伪弃用”:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference / ...- 是否有人对此有更多信息,例如,是否有计划substr()在将来的任何时候实际弃用的浏览器?还是如Steven Lu所建议的那样,使用substr()向前可能会对性能造成不利影响吗?
jamess

Answers:


930

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

链接?

https://developer.mozilla.org/zh-CN/JavaScript/Reference/Global_Objects/String/substr

https://developer.mozilla.org/zh-CN/JavaScript/Reference/Global_Objects/String/substring


61
听起来像是常见的错误来源。很高兴知道区别。在此处找到有关此内容的其他评论:rapd.wordpress.com/2007/07/12/javascript-substr-vs-substring
schnaader 2010年

3
也@Pawel当你把它想将字符串的结尾(没有第二个参数)
安德烈Chalella

这太荒谬了,我几乎错过了开发Java applet的日子。(“几乎”,因为那时我们不得不担心IE。)
Michael Scheper

2
您还应该在第一个参数上提到差异,这对于substr可以为负(在这种情况下,它从末尾开始),但是对于substring则不能。请参阅JefferMC的答案,但票数少,很多人可能会错过这一重要部分。
youen

2
由于这是迄今为止最受欢迎的答案,因此可能应对其进行编辑以包括String.prototype.substr()已弃用的答案...(在ECMA-262标准的附录B中进行了定义,其言 指出:“ ...程序员不应使用或假定编写新的ECMAScript代码时这些功能和行为是否存在。…”)
TS

309

substringMDN)将参数设为(from, to)
substrMDN)将参数设为(from, length)

更新:MDN认为是substr旧版。

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

您可能还记得substring采用索引,还有另一种字符串提取方法slice

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


140
.substring()取索引。您会记得,因为它是唯一一个名称中带有“ i”的名称。 .slice()也采用索引。
colllin 2014年

10
@colllin,有关i和指数的评论肯定应该纳入答案!
MyDaftQuestions 2015年

35

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

substr()接受一个负的起始位置作为相对于字符串结尾的偏移量。 substring()才不是。

MDN

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

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

substring(begin-offset, end-offset-exclusive)起始偏移0量大于或等于

substr(begin-offset, length) 起点偏移也可能为负


25

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

有关此主题的更多信息,请参见此处


17

主要区别在于

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"
保罗

8

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

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

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'

5

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


2
您是否可以指出表明已弃用的可靠来源substr()?我已经从几个人那里读过它,但是在网络上找不到支持该声明的任何信息。此外,Mozilla不包括它的过时/过时的功能列表:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
DanielM

@DanielM据我所记得,当我发布此答案时,它已被弃用,也许文章已更改,但现在不被弃用(但不确定) ..但仍记录在某些文章上,例如sstut.com/javascript/substring-不推荐使用method.php
5ervant

3
@DanielM 在ECMA-262标准的附件BString.prototype.substr()定义,其引言指出:“…程序员在编写新的ECMAScript代码时不应使用或假定存在这些功能和行为。…”
TS

substr()确实指出@TS 在某些文档中已弃用。
5ervant

2
到目前为止,这应该是公认的答案。在没有替代方法的情况下,使用遗留函数不是好的代码的选择。请投票给该答案,以使它在Google引导至此页面时更加可见。
vbezhenar


3

substring(): 它有2个参数“开始”和“结束”。

  • start参数是必需的,它指定开始提取的位置。
  • end参数是可选的,它指定提取应终止的位置。

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

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

Output : Substring

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

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

Output : Substring

substr():它有2个参数“ 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


2

子字符串(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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.