ChatGPT解决这个技术问题 Extra ChatGPT

What is the difference between substr and substring?

What is the difference between

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

and

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

They both seem to output “ab”.

Note, substring outperforms all others on Chrome (according to the now-defunct jsperf.com) as of late.
Adding on to @Derek comment... Unlike the slice method, substring does not handle the adjustment for negative parameters.
I think the more important question is "why does JavaScript have both a substr method and a substring method"? This is really the preferred method of overloading?
As of today, MDN has a big red warning about substr() being what you might call "pseudo-deprecated" at the top of the docs page here: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - Does anyone have more information about this, e.g. is there any browser that is planning to actually deprecate substr() at any point in the future? Or as Steven Lu suggested, might there be performance disadvantages to using substr() going forward?
@codekandis it's at the bottom table: i.imgur.com/BHkYWHA.png

N
NullPointerException

The difference is in the second argument. The second argument to substring is the index to stop at (but not include), but the second argument to substr is the maximum length to return.

Links?

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


Sounds like a common source of error. Good to know the difference. Found additional comments about this here: rapd.wordpress.com/2007/07/12/javascript-substr-vs-substring
@Pawel also when you want it to the end of the string (no second argument)
You should also mention the difference on the first argument, which can be negative for substr (in which case it starts from the end), but not for substring. See JefferMC answer, but it has so many less votes that a lot of people might miss this important part.
As this is the by far most upvoted answer, it should probably be edited to include that String.prototype.substr() is deprecated... (It is defined in Annex B of the ECMA-262 standard, whose introduction states: "… Programmers should not use or assume the existence of these features and behaviours when writing new ECMAScript code. …")
substr handle negative start value whereas substring doesn't: "Hello".substr(-2); // return "lo" "Hello".substring(-2); // return "Hello"
H
Hasan Sefa Ozalp

substr (MDN) takes parameters as (from, length).
substring (MDN) takes parameters as (from, to).

Update: MDN considers substr legacy.

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

You can remember substring (with an i) takes indices, as does yet another string extraction method, slice (with an i).

When starting from 0 you can use either method.


.substring() takes indices. You can remember because it's the only one with an 'i' in the name. .slice() takes indices too.
@colllin, that comment about the i and indicies surely should be moved into the answer!
Upvoted just for the mnemonic
2
2540625

As hinted at in yatima2975's answer, there is an additional difference:

substr() accepts a negative starting position as an offset from the end of the string. substring() does not.

From MDN:

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

So to sum up the functional differences:

substring(begin-offset, end-offset-exclusive) where begin-offset is 0 or greater

substr(begin-offset, length) where begin-offset may also be negative


S
S.Serpooshan

The main difference is that

substr() allows you to specify the maximum length to return

substring() allows you to specify the indices and the second argument is NOT inclusive

There are some additional subtleties between substr() and substring() such as the handling of equal arguments and negative arguments. Also note substring() and slice() are similar but not always the same.

  //*** 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"        

You missed the useful "negative second argument" for slice: "string".slice(2,-2); // "ri"
y
yatima2975

Another gotcha I recently came across is that in IE 8, "abcd".substr(-1) erroneously returns "abcd", whereas Firefox 3.6 returns "d" as it should. slice works correctly on both.

More on this topic can be found here.


5
5ervant - techintel.github.io

The big difference is, substr() is a deprecated method that can still be used, but should be used with caution because they are expected to be removed entirely sometime in the future. You should work to remove their use from your code. And the substring() method succeeded and specified the former one.


Can you point to a reliable source that indicates the deprecation of substr()? I have read it from several people, but I cannot find any information on the web that supports the statement. Plus, Mozilla does not include it on the list of deprecated/obsolete features: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
@DanielM As far as I remember, it was deprecated when I post this answer, maybe the article changed and it's now not deprecated (but not sure).. But still recorded on some articles such as in sstut.com/javascript/substring-method.php as deprecated.
@DanielM String.prototype.substr() is defined in Annex B of the ECMA-262 standard, whose introduction states: "… Programmers should not use or assume the existence of these features and behaviours when writing new ECMAScript code. …"
@TS substr() is really noted as deprecated on some documents.
This should be the an accepted answer as of today. Using legacy functions when there's alternative is not an option for good code. Please upvote this answer to make it more visible as Google leads to this page.
K
Kmeixner

The difference is second parameter. Their second parameters, while both numbers, are expecting two different things:

When using substring the second parameter is the first index not to include:

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

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

When using substr the second parameter is the number of characters to include in the substring:

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(): It has 2 parameters "start" and "end".

start parameter is required and specifies the position where to start the extraction.

end parameter is optional and specifies the position where the extraction should end.

If the end parameter is not specified, all the characters from the start position till the end of the string are extracted.

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

If the value of start parameter is greater than the value of the end parameter, this method will swap the two arguments. This means start will be used as end and end will be used as start.

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

substr(): It has 2 parameters "start" and "count".

start parameter is required and specifies the position where to start the extraction.

count parameter is optional and specifies the number of characters to extract.

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

If the count parameter is not specified, all the characters from the start position till the end of the string are extracted. If count is 0 or negative, an empty string is returned.

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


S
Sajith Mantharath

substring(startIndex, endIndex(not included))

substr(startIndex, how many characters)

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

EDIT: This answer is with reference to R programming

Here are major differences between substr() and substring():

substr() has arguments start & stop while substring as arguments first & last. substr(x, start, stop)

and

substring(text, first, last = 1000000L)

EXAMPLE

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

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

substring function has a large default value [1000000L] of 'last' argument so you may skip specifying that while substr function needs you to specify the value of stop argument.

EXAMPLE

substr("abcdef", start = 2)
Error in substr("abcdef", start = 2) : 
  argument "stop" is missing, with no default

substring("abcdef", first = 2)
[1] "bcdef"

If you apply substr function to several starting or stopping points, the function uses only the first entry (i.e. the stopping point 1) while substring function will extract several possible strings.

EXAMPLE

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

Someone mention use of negative index/zero. Both are accepted by substr() and substring().

EXAMPLE

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

Important Note for using substr() or substring() for string replacement:

The replacement needs to have the same number of characters as the replaced part of your data. If you want to replace a substring with a string with different length, you might have a look at the gsub() function.

P.S. I am using R version 4.0.4


This answer is wrong for negative numbers, as they are not treated the same. substr(-2) will start at position -2 from the end of the string, returning the last two characters. substring converts all negative numbers to zero or string lengths. So substring(-2) will be converted to substring(0) returning the whole string. 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.
@Michel. I didn't notice tag #javascript and answered for how it works in R BUT my note clearly mentions I am providing code & explanation for R.