关于javascript:substr和substring有什么区别?

What is the difference between substr and substring?

两者有什么区别

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

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

它们似乎都输出"ab"。

  • derek朕會功夫音符",在所有其他substringoutperforms铬为晚。
  • 在"添加到Derek的评论……《slice法不同,不substring手柄调整参数为负。
  • 我认为更重要的问题是"为什么有两个A substrJavaScript方法和一substring法"?这是我们的首选方法的重载?
  • 截至今天,有一个大红色的MDN预警substr()你可能是呼叫"伪过时的"Top of the Docs页面在这里:developer.mozilla.org /美国/文档/网络/ JavaScript /参考/ & hellip;任何人有更多的信息关于这个,这是有任何浏览器。计划是在任何一点的deprecate substr()未来?史蒂芬路或作为建议,可能有性能缺陷,利用substr()去前锋?


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

链接?

https://developer.mozilla.org/en/javascript/reference/global_objects/string/substr

https://developer.mozilla.org/en/javascript/reference/global_objects/string/substring

  • 听起来像是一个常见的错误来源。很高兴知道区别。在这里找到了更多关于这个的评论:rapd.wordpress.com/2007/07/12/javascript-substr-vs-substring
  • 在jsfiddle中演示,运行并查看控制台:jsfiddle.net/m4crzwjs
  • @当您希望它到达字符串的末尾时也可以使用pawel(没有第二个参数)
  • 这太荒谬了,我几乎错过了开发Java小程序的日子。(‘几乎’,因为那时我们不得不担心IE。)
  • 您还应该提到第一个参数的区别,对于SUBSTR(在这种情况下,它从末尾开始),可以是负数,但对于SUBString则不是。看杰弗马克的回答,但是它的选票太少了,很多人可能会错过这个重要的部分。
  • 由于这是迄今为止最乐观的答案,因此应该对其进行编辑,将String.prototype.substr()弃用于……(它在ECMA-262标准的附录B中定义,其引言中指出:"……程序员在编写新的ECMAScript代码时,不应使用或假定这些特性和行为的存在。"……")


substr(mdn)取参数为(from, length)substring(mdn)取参数为(from, to)

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

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

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

  • .substring()采用指数。你可以记住,因为这是唯一一个名字里有"我"的。.slice()也采用指数。
  • @Collin,关于I和起诉的评论应该被纳入答案中!


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

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

来自MDN:

If start is negative, substr() uses it as a character index from the
end of the string.

因此,总结功能差异:

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

substr(begin-offset, length),其中开始偏移也可能为负。


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

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


主要区别在于

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

substring()允许您指定索引,第二个参数不包含在内。

SUBSTR()和SUBString()之间还有一些附加的微妙之处,例如处理相等参数和负参数。还要注意,substring()和slice()是相似的,但并不总是相同的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  //*** 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"

差异是第二个参数。他们的第二个参数,虽然这两个数字,却都期望两个不同的东西:

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

1
2
3
4
5
var s ="string";
s.substring(1, 3); // would return 'tr'

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

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

1
2
3
4
5
var s ="string";
s.substr(1, 3); // would return 'tri'

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

  • 这样的数字太离谱了哇


slice vs substr vs substring vs[]方法

这些javascript方法都有性能优势。请相应地使用这些功能。

  • 如果这个答案包含了一些关于绩效效益相关结果的总结文本,那么这个答案会更好。


子串():它有两个参数"开始"和"结束"。

  • start参数是必需的,并指定启动位置提取。
  • 结束参数是可选的,并指定提取应结束。

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

1
2
3
4
5
var str ="Substring Example";
var result = str.substring(0, 10);
alert(result);

Output : Substring

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

1
2
3
4
5
var str ="Substring Example";
var result = str.substring(10, 0);
alert(result);

Output : Substring

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

  • start参数是必需的,并指定启动位置提取。

  • count参数是可选的,指定提取液。

1
2
3
4
5
6
var str ="Substr Example";
var result = str.substr(0, 10);
alert(result);


Output : Substr Exa

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

1
2
3
4
5
var str ="Substr Example";
var result = str.substr(11);
alert(result);

Output : ple


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

  • 你能指出一个可靠的来源来表明substr()的贬值吗?我从几个人那里读过,但是我在网上找不到任何支持这个声明的信息。此外,Mozilla没有将其列入弃用/过时功能列表:developer.mozilla.org/en us/docs/web/javascript/reference/…
  • @据我所知,当我发布这个答案时,它被否决了,也许文章改变了,现在它没有被否决(但不确定)。但仍记录在sstut.com/javascript/substring-method.php等文章中,已弃用。
  • @Danielm String.prototype.substr()在ECMA-262标准的附录B中定义,其引言中指出:"…程序员在编写新的ECMAScript代码时,不应使用或假定这些特性和行为的存在。……"
  • @在某些文件中,ts substr()确实被认为是不赞成使用的。
  • 是的,我就是这么说的:在标准中它被认为是不推荐使用的!或者您不认为"不应该使用或假定这些特性的存在"是不推荐使用的吗?好吧,他们不使用"不推荐使用"这个词,但是我觉得描述很清楚…
  • 您链接到的Mozilla文档说,虽然SUBSTR没有被严格否决,但它被认为是一个遗留函数,应尽可能避免使用。值得一提的是,不知道你为什么被否决。
  • @朱利安,因为在这个答案给出之后,他们在developer.mozilla.org/en-us/docs/web/javascript/reference/…上看不到substr()
  • 这应该是今天公认的答案。在有其他选择的情况下使用遗留函数不是好代码的选择。请将此答案加上投票,使其在谷歌进入此页面时更可见。