substr和substring有什么区别?

Dif*_*ine 813 javascript substring

有什么区别

alert("abc".substr(0,2));
Run Code Online (Sandbox Code Playgroud)

alert("abc".substring(0,2));
Run Code Online (Sandbox Code Playgroud)

他们似乎都输出"ab".

Del*_*ani 898

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

链接?

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/substr

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/String/substring

  • 听起来像是常见的错误来源.很高兴知道差异.在此处找到有关此内容的其他评论:http://rapd.wordpress.com/2007/07/12/javascript-substr-vs-substring/ (60认同)
  • @Pawel也希望它到字符串的末尾(没有第二个参数) (3认同)
  • ```substr``` 处理负起始值,而 ```substring``` 不处理: ```"Hello".substr(-2); // return "lo"``` ```"Hello".substring(-2); // 返回“你好”``` (3认同)
  • 您还应该在第一个参数上提到差异,这对于substr可以为负(在这种情况下,它从末尾开始),但是对于substring则不能。请参阅JefferMC的答案,但票数少,很多人可能会错过这一重要部分。 (2认同)
  • 由于这是迄今为止最受欢迎的答案,因此可能应对其进行编辑以包含不推荐使用的String.prototype.substr()...(在[附件B](https://www.ecma- ECMA-262标准的international.org/ecma-262/9.0/index.html#sec-string.prototype.substr),其[简介](https://www.ecma-international.org/ecma-262/ 9.0 / index.html#sec-additional-ecmascript-features-for-web-browsers)指出:“ ...编写新的ECMAScript代码时,程序员不应使用或假定这些功能和行为存在。...”) (2认同)

Col*_*ert 297

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

alert("abc".substr(1,2)); // returns "bc"
alert("abc".substring(1,2)); // returns "b"
Run Code Online (Sandbox Code Playgroud)

你可以记住substringtake索引,就像另一个字符串提取方法slice一样.

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

  • `.substring()`接受索引.你可以记住,因为它是唯一一个名字中带有'i'的人.`.slice()`也需要索引. (133认同)
  • @colllin,关于我和指标的评论肯定应该转移到答案中! (10认同)

小智 33

正如在yatima2975的答案中暗示的那样,还有一个区别:

substr()接受负起始位置作为从字符串末尾的偏移量. substring()才不是.

来自MDN:

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

所以总结一下功能差异:

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

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


yat*_*975 25

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

有关此主题的更多信息,请访问此处.


Nat*_*ipp 13

主要区别在于

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"        
Run Code Online (Sandbox Code Playgroud)

  • 您错过了 `slice` 有用的“负第二个参数”:`"string".slice(2,-2); //“里”` (3认同)

5er*_*ant 8

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

  • @DanielM `String.prototype.substr()` 在 [Annex B](https://www.ecma-international.org/ecma-262/9.0/index.html#sec-string.prototype.substr) 中定义ECMA-262 标准,其[介绍](https://www.ecma-international.org/ecma-262/9.0/index.html#sec-additional-ecmascript-features-for-web-browsers) 指出:“ ……程序员在编写新的 ECMAScript 代码时不应该使用或假设这些特性和行为的存在。……” (3认同)
  • 截至今天,这应该是公认的答案。在有替代方案时使用遗留函数不是好的代码的选择。请对此答案点赞,以使其在 Google 引导到此页面时更加明显。 (3认同)
  • 你能指出一个表明`substr()`被弃用的可靠来源吗?我从几个人那里读过,但我在网上找不到任何支持该声明的信息。此外,Mozilla 未将其包含在弃用/过时功能列表中:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Deprecated_and_obsolete_features (2认同)

小智 7

差异是第二个参数.他们的第二个参数,虽然两个数字,期待两个不同的东西:

使用substring时,第二个参数是第一个不包括的索引:

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

var s = "another example";
s.substring(3, 7); // would return 'ther'
Run Code Online (Sandbox Code Playgroud)

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

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

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


raj*_*oju 6

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

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

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

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

Output : Substring
Run Code Online (Sandbox Code Playgroud)

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

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

Output : Substring
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


Output : Substr Exa
Run Code Online (Sandbox Code Playgroud)

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

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

Output : ple
Run Code Online (Sandbox Code Playgroud)