add reverse() method to strings

# Grigory Hatsevich (7 years ago)

I would propose to add reverse() method to strings. Something equivalent to the following:

String.prototype.reverse = function(){ return this.split('').reverse().join('') }

It seems natural to have such method. Why not?

# Oriol _ (7 years ago)

Be aware your code breaks pair surrogates, which might be undesirable:

var str = "a_\uD83D\uDE80_b";
str.split("").reverse().join(""); // "b_\uDE80\uD83D_a" :(
[...str].reverse().join("");      // "b_\uD83D\uDE80_a" :)
# Claude Pache (7 years ago)

Le 17 mars 2018 à 19:29, Oriol _ <oriol-bugzilla at hotmail.com> a écrit :

Be aware your code breaks pair surrogates, which might be undesirable:

var str = "a_\uD83D\uDE80_b";
str.split("").reverse().join(""); // "b_\uDE80\uD83D_a" :(
[...str].reverse().join("");      // "b_\uD83D\uDE80_a" :)

—Oriol

Well, but be aware that the corrected implementation still breaks graphemes composed by a sequence of code points, such as: n̈ ( LATIN SMALL LETTER N + COMBINING DIEARESIS), which might be undesirable...

Anyway, what are the use cases?

# Thomas Grainger (7 years ago)

String.prototype.reverse() might break web compatibility, how about String.prototype.turnyRoundy()?

# Felipe Nascimento de Moura (7 years ago)

I would use Array.from:

str = "a_\uD83D\uDE80_b"
Array.from(str).reverse().join('')

But I also upvote the idea of having a reverse method in strings :)

If reverse might cause some retrocompatibility problem (although I don't think it requires params, what would pretty much avoid different implementations as the method itself is very straight forwards), we could go for reverseText or reverseContent.

.o/

[ ]s

--

Felipe N. Moura Web Developer, Google Developer Expert developers.google.com/experts/people/felipe-moura, Founder of

BrazilJS braziljs.org and Nasc nasc.io.

Website: felipenmoura.com / nasc.io Twitter: @felipenmoura twitter.com/felipenmoura

Facebook: fb.com/felipenmoura LinkedIn: goo.gl/qGmq

Changing the world is the least I expect from myself!

# J Decker (7 years ago)

Other than for amusement or programming challenge I've never found a use for it? Do you have one?

# Mike Samuel (7 years ago)

Previous discussion: esdiscuss.org/topic/wiki-updates-for-string-number-and-math-libraries#content-1

""" String.prototype.reverse(), as proposed, corrupts supplementary characters. Clause 6 of Ecma-262 redefines the word "character" as "a 16-bit unsigned value used to represent a single 16-bit unit of text", that is, a UTF-16 code unit. In contrast, the phrase "Unicode character" is used for Unicode code points. For reverse(), this means that the proposed spec will reverse the sequence of the two UTF-16 code units representing a supplementary character, resulting in corruption. If this function is really needed (is it? for what?), it should preserve the order of surrogate pairs, as does java.lang.StringBuilder.reverse: download.oracle.com/javase/7/docs/api/java/lang/StringBuilder.html#reverse() """

# Mathias Bynens (7 years ago)

So far no one has provided a real-world use case.

# Grigory Hatsevich (7 years ago)

My use case is solving coding tasks about palindromes on codefights.com.
Not sure if that counts as "real-world", but probably a lot of beginning
developers encounter such tasks at least once.

# Frederick Stark (7 years ago)

The point of a coding task for a beginner is to practice their problem solving skills to solve the task. This would remove the challenge and actively worsen their learning process

# Grigory Hatsevich (7 years ago)

"This would remove the challenge and actively worsen their learning process" -- this is not true. You can see it e.g. by looking at the specific task I was talking about:

"Given a string, find the shortest possible string which can be achieved by adding characters to the end of initial string to make it a palindrome."

This is my code for this task:

function buildPalindrome(s){
    String.prototype.reverse=function(){
        return this.split('').reverse().join('')
    }

    function isPalindrome(s){
        return s===s.reverse()
    }
    for (i=0;i<s.length;i++){
        first=s.slice(0,i);
        rest=s.slice(i);
        if(isPalindrome(rest)){
            return s+first.reverse()
           }
    }
}

As you see, the essence of this challenge is not in the process of reversing a string. Having a reverse() method just makes the code more readable -- comparing to alternative when one would have to write .split('').reverse().join('') each time instead of just .reverse()

# Mark Davis ☕️ (7 years ago)

.reverse would only be reasonable for a subset of characters supported by Unicode. Its primary cited use case is for a particular educational example, when there are probably thousands of similar examples of educational snippets that would be rarely used in a production environment. Given that, it would be far better for those people who really need it to just provide that to their students as a provided function for the sake of that example.

Mark

# Felipe Nascimento de Moura (7 years ago)

I have had to use that one, parsing texts and I remember I had to reverse strings that represented tokens...but that was very specific.

What I would like to see in strings would be something like "firstCase" for transforming "felipe" into "Felipe" for example. I always have to use something like str[0].toUpperCase() + str.slice(1).

The only reason I would defend the "reverse" method in strings is because it makes sense. I think JavaScript is very intuitive, and, as Arrays do have the "reverse" method, that simply makes sense to have it in strings as well.

Cheers.

[ ]s

--

Felipe N. Moura Web Developer, Google Developer Expert developers.google.com/experts/people/felipe-moura, Founder of

BrazilJS braziljs.org and Nasc nasc.io.

Website: felipenmoura.com / nasc.io Twitter: @felipenmoura twitter.com/felipenmoura

Facebook: fb.com/felipenmoura LinkedIn: goo.gl/qGmq

Changing the world is the least I expect from myself!

# Mathias Bynens (7 years ago)

For arrays, indexing is unambiguous: array[42] is whatever value you put there. As a result, it’s clear what it means to “reverse” an array.

This is not the case for strings, where indexing is inherently ambiguous. Should string[42] index by UCS-2/UTF-16 code unit? By Unicode code point? By grapheme cluster?

# kdex (7 years ago)

If more than one type of reversal makes sense, are there any good reasons against covering this by an optional mode argument? This approach would be analogous to String.prototype.normalize.

# Claude Pache (7 years ago)

The only reason I would defend the "reverse" method in strings is because it makes sense. I think JavaScript is very intuitive, and, as Arrays do have the "reverse" method, that simply makes sense to have it in strings as well.

”Making sense” and ”symmetry of API” is not a sufficient reason, because a string is not ”just” an immutable array of chars. Consider:

  1. Some methods defined on arrays only: find, reduce, reverse
  2. Some methods defined on strings only: repeat, startsWith
  3. Some methods defined on both arrays and strings with same semantics: concat, slice
  4. Some methods defined on both arrays and strings with different semantics: includes, indexOf

Existence of methods listed in (1), (2) and (4) is a consequence of strings and arrays having different needs.

# Felipe Nascimento de Moura (7 years ago)

yep agreed...that's not enough reason (I just added that might be "the reason for...").

Cheers.

[ ]s

--

Felipe N. Moura Web Developer, Google Developer Expert developers.google.com/experts/people/felipe-moura, Founder of

BrazilJS braziljs.org and Nasc nasc.io.

Website: felipenmoura.com / nasc.io Twitter: @felipenmoura twitter.com/felipenmoura

Facebook: fb.com/felipenmoura LinkedIn: goo.gl/qGmq

Changing the world is the least I expect from myself!