Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why substring does not handle negative indices? [closed]

substr() handles negative indices perfectly but substring() only accepts nonnegative indices.

Is there a reason of not using substr in favor of substring? The usage of negative indices are so useful in a lot of cases by viewing the space of indices as cyclic group. Why substr is indicated "deprecated" by MDN?

like image 307
Kaa1el Avatar asked Aug 26 '16 20:08

Kaa1el


People also ask

Does substring accept negative index?

substring only uses 0 and positive values, converting negative numbers to 0. It will also swap values when the start index is after the end index.

Does slice accept a negative index?

slice() is more flexible than substring() because it allows negative argument values.

How do substring () and substr () differ?

The difference between substring() and substr()The two parameters of substr() are start and length , while for substring() , they are start and end . substr() 's start index will wrap to the end of the string if it is negative, while substring() will clamp it to 0 .

How do you slice negative index in Python?

To get substring using negative index in python, we will use “slice(-1, -4, -1)”. Here, the start is “-1”, the end “-4”, and the step is negative “-1”.


3 Answers

substring is when you want to specify a starting and ending index. substr is when you want to specify a starting offset and a length. They do different things and have different use cases.

Edit: To better answer the exact question of
Why substring does not handle negative indices?

substring specifies a starting and ending index of characters in a string. substr deals with a starting offset and a length. It makes sense to me that substring does not allow a negative index, because there really isn't a such thing as a negative index (the characters in a string are indexed from 0 to n, a "negative index" would be out of bounds). Since substr is dealing with an offset vs an index, I feel the term offset is loose enough to allow for a negative offset, which of course means counting backwards from the end of the string rather than forward from the beginning. This might just be semantics, but its how I make sense of it.

Why is substr deprecated?

I would argue that is in fact not deprecated.

The revision history for the substr MDN states the deprecation notice was put in based on this blog post:

Aug 16, 2016, 12:00:34 AM hexalys add deprecated mention per https://blog.whatwg.org/javascript

Which states that the HTML string methods are deprecated (which they should be!). These are methods that wrap a string in an HTML tag, ie, "abc".sub() would return <sub>abc</sub>. The blog post lists out all of the HTML string methods, and imho, erroneously includes subtr as an HTML string method (it isn't).

So this looks like a misunderstanding to me.

(Excerpt below, emphasis added by me)

Highlights:

The infamous “string HTML methods”: String.prototype.anchor(name), String.prototype.big(), String.prototype.blink(), String.prototype.bold(), String.prototype.fixed(), String.prototype.fontcolor(color), String.prototype.fontsize(size), String.prototype.italics(), String.prototype.link(href), String.prototype.small(), String.prototype.strike(), String.prototype.sub(), String.prototype.substr(start, length), and String.prototype.sup(). Browsers implemented these slightly differently in various ways, which in one case lead to a security issue (and not just in theory!). It was an uphill battle, but eventually browsers and the ECMAScript spec matched the behavior that the JavaScript Standard had defined.

https://blog.whatwg.org/javascript

like image 58
chiliNUT Avatar answered Oct 26 '22 22:10

chiliNUT


substr is particularly useful when you are only interested in the last N characters of a string of unknown length.

For example, if you want to know if a string ends with a single character:

function endsWith(str, character) {
  return str.substr(-1) === character;
}

endsWith('my sentence.', '.'); // => true
endsWith('my other sentence', '.'); // => false

Implementing this same function using substring would require you calculating the length of the string first.

function endsWith(str, character) {
  var length = str.length;
  return str.substring(length - 1, length) === character;
}

Both functions can be used to get the same results, but having substr is more convenient.

like image 22
Steven Schobert Avatar answered Oct 26 '22 20:10

Steven Schobert


There are three functions in JS that do more or less the same:

  • substring
  • substr
  • slice

I guess most people use the latter, because it matches its array counterpart. The former two are more or less historical relicts (substring was in JS1, then substr came in two different flavours etc).

Why substr is indicated "deprecated" by MDN?

The notice has been added as per this post by Mathias where substr is listed under "string HTML methods" (?). The reason of the deprecation is that it belongs to the Annex B which says:

This annex describes various legacy features and other characteristics of web browser based ECMAScript implementations. All of the language features and behaviours specified in this annex have one or more undesirable characteristics and in the absence of legacy usage would be removed from this specification.

like image 3
georg Avatar answered Oct 26 '22 20:10

georg