Comment inverser une chaîne en place en JavaScript?

435

Comment inverser une chaîne en place (ou en place) en JavaScript lorsqu'elle est passée à une fonction avec une instruction return, sans utiliser de fonctions intégrées ( .reverse(), .charAt()etc.)?

Kobe
la source
donc, vous n'êtes pas autorisé à utiliser .charAt () pour obtenir les caractères de la chaîne?
Irwin
155
Tu ne peux pas. Les chaînes JavaScript sont immuables, ce qui signifie que la mémoire allouée à chacune ne peut pas être écrite, ce qui rend impossible de véritables inversions "sur place".
Crescent Fresh
2
Re: commentaire de crescentfresh voir stackoverflow.com/questions/51185/…
baudtack
1
@crescentfresh, vous devez publier cela comme une nouvelle réponse.
baudtack

Réponses:

737

Tant que vous avez affaire à des caractères ASCII simples et que vous êtes heureux d'utiliser des fonctions intégrées, cela fonctionnera:

function reverse(s){
    return s.split("").reverse().join("");
}

Si vous avez besoin d'une solution qui prend en charge UTF-16 ou d'autres caractères multi-octets, sachez que cette fonction donnera des chaînes Unicode invalides ou des chaînes valides qui ont l'air drôles. Vous voudrez peut-être envisager cette réponse à la place .

[... s] est compatible Unicode, une petite modification donne: -

function reverse(s){
    return [...s].reverse().join("");
}
belacqua
la source
44
Ceci est rompu pour les chaînes UTF-16 qui contiennent des paires de substitution, c'est-à-dire des caractères en dehors du plan multilingue de base. Cela donnera également des résultats amusants pour les chaînes contenant des caractères de combinaison, par exemple une tréma peut apparaître sur le caractère suivant. Le premier problème entraînera des chaînes Unicode non valides, le second des chaînes valides qui ont l'air drôles.
Martin Probst
2
@Richeve Bebedor "Tout sans utiliser les fonctions intégrées? .Reverse ()" Ce ne serait pas une solution acceptée car elle ne rentre pas dans les limites de la question, bien qu'elle soit une solution viable pour inverser une chaîne dans JS.
David Starkey
1
@DavidStarkey: Oui, en y repensant près de quatre ans plus tard, il est difficile de voir comment j'ai tellement raté le point de la question. On dirait que j'aurais dû attendre deux minutes et voter le commentaire de crescentfresh sur le message original!
belacqua
14
@MartinProbst Ma réponse fournit une solution Unicode au problème qui traite des paires de substitution et des combinaisons de marques correctement: stackoverflow.com/a/16776380/96656
Mathias Bynens
1
Pour UTF-16 return [...s].reverse().join("");peut fonctionner.
user4642212
411

La technique suivante (ou similaire) est couramment utilisée pour inverser une chaîne en JavaScript:

// Don’t use this!
var naiveReverse = function(string) {
    return string.split('').reverse().join('');
}

En fait, toutes les réponses publiées jusqu'à présent sont une variation de ce modèle. Cependant, il existe certains problèmes avec cette solution. Par exemple:

naiveReverse('foo 𝌆 bar');
// → 'rab �� oof'
// Where did the `𝌆` symbol go? Whoops!

Si vous vous demandez pourquoi cela se produit, lisez le codage de caractères interne de JavaScript . (TL; DR: 𝌆est un symbole astral et JavaScript l'expose comme deux unités de code distinctes.)

Mais il y a plus:

// To see which symbols are being used here, check:
// http://mothereff.in/js-escapes#1ma%C3%B1ana%20man%CC%83ana
naiveReverse('mañana mañana');
// → 'anãnam anañam'
// Wait, so now the tilde is applied to the `a` instead of the `n`? WAT.

Une bonne chaîne pour tester les implémentations inverses de chaînes est la suivante :

'foo 𝌆 bar mañana mañana'

Pourquoi? Parce qu'il contient un symbole astral ( 𝌆) (qui sont représentés par des paires de substitution en JavaScript ) et une marque de combinaison ( le dernier mañanase compose en fait de deux symboles: U + 006E LETTRE MINUSCULE LATINE N et U + 0303 TILDE COMBINÉE).

L'ordre dans lequel les paires de substitution apparaissent ne peut pas être inversé, sinon le symbole astral n'apparaîtra plus dans la chaîne `` inversée ''. C'est pourquoi vous avez vu ces ��marques dans la sortie de l'exemple précédent.

Les marques de combinaison sont toujours appliquées au symbole précédent, vous devez donc traiter le symbole principal (U + 006E LETTRE MINUSCULE LATINE N) comme la marque de combinaison (U + 0303 TILDE COMBINÉE) dans son ensemble. Si vous inversez leur ordre, la marque de combinaison sera associée à un autre symbole de la chaîne. C'est pourquoi l'exemple de sortie avait au lieu de ñ.

Espérons que cela explique pourquoi toutes les réponses publiées jusqu'à présent sont fausses .


Pour répondre à votre question initiale - comment inverser [correctement] une chaîne en JavaScript -, j'ai écrit une petite bibliothèque JavaScript qui est capable d'une inversion de chaîne compatible Unicode. Il n'a aucun des problèmes que je viens de mentionner. La bibliothèque s'appelle Esrever ; son code est sur GitHub, et il fonctionne dans à peu près n'importe quel environnement JavaScript. Il est livré avec un utilitaire shell / binaire, vous pouvez donc facilement inverser les chaînes de votre terminal si vous le souhaitez.

var input = 'foo 𝌆 bar mañana mañana';
esrever.reverse(input);
// → 'anañam anañam rab 𝌆 oof'

Quant à la partie «sur place», voir les autres réponses.

Mathias Bynens
la source
65
Vous devez inclure la partie principale du code d'Esrever dans votre réponse.
r0estir0bbe
1
@Meglio Avec cette approche spécifique, oui.
Mathias Bynens
8
Le problème, bien sûr, est que "inverser une chaîne" sonne sans ambiguïté, mais ce n'est pas face aux problèmes mentionnés ici. L'inversion d'une chaîne renvoie-t-elle la chaîne qui, lors de l'impression, afficherait les grappes de graphèmes dans la chaîne dans l'ordre inverse? D'une part, cela semble probable. De l'autre, pourquoi voudriez-vous jamais faire ça? Cette définition dépend de son impression, et l'impression d'une chaîne inversée est rarement utile. Dans le cadre d'un algorithme, vos besoins peuvent être complètement différents.
Martijn
19
Même si cela fait un grand travail d'expliquer le problème, la réelle réponse est dans un autre château . Comme @ r0estir0bbe l'a dit il y a plus d'un an, le code pertinent devrait être dans la réponse, pas seulement lié.
TJ Crowder
4
"Espérons que cela explique pourquoi toutes les réponses publiées jusqu'à présent sont fausses" - Cette affirmation est trop énergique. De nombreux cas d'utilisation ne nécessitent pas de prise en charge UTF-16 (exemple simple; utilisation des URL et des composants / paramètres d'URL). Une solution n'est pas "fausse" simplement parce qu'elle ne gère pas un scénario non requis. Notamment, la réponse la plus votée déclare explicitement qu'elle ne fonctionne qu'avec des caractères ASCII et qu'elle n'est donc certainement pas un peu fausse.
2018
92
String.prototype.reverse_string=function() {return this.split("").reverse().join("");}

ou

String.prototype.reverse_string = function() {
    var s = "";
    var i = this.length;
    while (i>0) {
        s += this.substring(i-1,i);
        i--;
    }
    return s;
}
Bob
la source
Je suis définitivement d'accord avec le prototype String.
Jeff Meatball Yang
3
la concaténation de chaînes est coûteuse. Mieux vaut construire un tableau et le rejoindre ou utiliser concat ().
Bjorn
2
# 1 est le meilleur, # 2 pourrait être horriblement lent
adamJLev
9
Cependant, aucune solution ne fonctionne lorsque des caractères composés Unicode sont présents.
Eric Grange
2
@JuanMendes J'ai laissé ce commentaire en 2009, les choses ont changé au cours des 4 dernières années. : P
Bjorn
63

Analyse détaillée et dix façons différentes d'inverser une chaîne et ses détails de performance.

http://eddmann.com/posts/ten-ways-to-reverse-a-string-in-javascript/

Performances de ces implémentations:

Implémentation (s) la plus performante (s) par navigateur

  • Chrome 15 - Implémentations 1 et 6
  • Firefox 7 - Implémentation 6
  • IE 9 - Mise en œuvre 4
  • Opera 12 - Implémentation 9

Voici ces implémentations:

Mise en œuvre 1:

function reverse(s) {
  var o = '';
  for (var i = s.length - 1; i >= 0; i--)
    o += s[i];
  return o;
}

Mise en œuvre 2:

function reverse(s) {
  var o = [];
  for (var i = s.length - 1, j = 0; i >= 0; i--, j++)
    o[j] = s[i];
  return o.join('');
}

Mise en œuvre 3:

function reverse(s) {
  var o = [];
  for (var i = 0, len = s.length; i <= len; i++)
    o.push(s.charAt(len - i));
  return o.join('');
}

Mise en œuvre 4:

function reverse(s) {
  return s.split('').reverse().join('');
}

Mise en œuvre 5:

function reverse(s) {
  var i = s.length,
      o = '';
  while (i > 0) {
    o += s.substring(i - 1, i);
    i--;
  }
  return o;
}

Mise en œuvre 6:

function reverse(s) {
  for (var i = s.length - 1, o = ''; i >= 0; o += s[i--]) { }
  return o;
}

Mise en œuvre 7:

function reverse(s) {
  return (s === '') ? '' : reverse(s.substr(1)) + s.charAt(0);
}

Mise en œuvre 8:

function reverse(s) {
  function rev(s, len, o) {
    return (len === 0) ? o : rev(s, --len, (o += s[len]));
  };
  return rev(s, s.length, '');
}

Mise en œuvre 9:

function reverse(s) {
  s = s.split('');
  var len = s.length,
      halfIndex = Math.floor(len / 2) - 1,
      tmp;


     for (var i = 0; i <= halfIndex; i++) {
        tmp = s[len - i - 1];
        s[len - i - 1] = s[i];
        s[i] = tmp;
      }
      return s.join('');
    }

Mise en œuvre 10

function reverse(s) {
  if (s.length < 2)
    return s;
  var halfIndex = Math.ceil(s.length / 2);
  return reverse(s.substr(halfIndex)) +
         reverse(s.substr(0, halfIndex));
}
Anil Arrabole
la source
53

L'ensemble "inverser une chaîne en place" est une question d'entrevue désuète programmeurs C, et les gens qui ont été interrogés par eux (pour se venger, peut-être?), Demanderont. Malheureusement, c'est la partie "In Place" qui ne fonctionne plus car les chaînes dans à peu près tous les langages gérés (JS, C #, etc.) utilisent des chaînes immuables, défaisant ainsi l'idée de déplacer une chaîne sans allouer de nouvelle mémoire.

Bien que les solutions ci-dessus inversent effectivement une chaîne, elles ne le font pas sans allouer plus de mémoire et ne remplissent donc pas les conditions. Vous devez avoir un accès direct à la chaîne telle qu'elle est allouée et pouvoir manipuler son emplacement de mémoire d'origine pour pouvoir l'inverser en place.

Personnellement, je déteste vraiment ce genre de questions d'entrevue, mais malheureusement, je suis sûr que nous continuerons à les voir pendant des années.

Mozleron
la source
7
Je peux au moins dire que j'ai eu un intervieweur il y a quelque temps assez impressionné quand il m'a demandé comment inverser une chaîne "en place" dans JS et j'ai expliqué pourquoi c'est impossible car les chaînes dans JS sont immuables. Je ne sais pas si c'était la réponse qu'il attendait ou si je l'ai un peu éduqué. Quoi qu'il en soit, cela a bien fonctionné;)
Chev
1
Peut-être qu'il veut dire «géré» par un garbage collector, du moins c'est ce que l'on entend généralement par «langage géré» ou par la présence d'une machine virtuelle / d'un environnement d'exécution virtuel? @torazaburo
AntonB
39

Tout d'abord, utilisez Array.from()pour transformer une chaîne en tableau, puis Array.prototype.reverse()pour inverser le tableau, puis Array.prototype.join()pour en faire une chaîne.

const reverse = str => Array.from(str).reverse().join('');
Michał Perłakowski
la source
Il y a des frais généraux, mais c'est une solution élégante! Il n'y a pas de réécriture de la reverselogique préexistante .
Gershom
2
@felixfbecker Non, string.split('')cela ne fonctionne pas. Voir cette réponse pour plus d'explications.
Michał Perłakowski
5
Cela devrait être la réponse acceptée car elle fonctionne également avec unicode. Par exemple, à partir de l'exemple ci-dessus:Array.from('foo 𝌆 bar mañana mañana').reverse().join('') == 'anãnam anañam rab 𝌆 oof'
Julian TF
3
@JulianTF Pas exactement, un tilde est toujours appliqué à 'a' au lieu de 'n'.
Roman Boiko
2
@RomanBoiko True, mais vous pouvez d'abord normaliser la chaîne. Array.from('foo 𝌆 bar mañana mañana'.normalize('NFC')).reverse().join('')deviendra"anañam anañam rab 𝌆 oof"
M. Lister
26

Dans ECMAScript 6, vous pouvez inverser une chaîne encore plus rapidement sans utiliser la .split('')méthode de fractionnement, avec l' opérateur d'étalement comme ceci:

var str = [...'racecar'].reverse().join('');
Luke Shimkus
la source
1
ES6 vous permet également d'utiliser deux backticks `` au lieu de('')
il n'y a aucune raison d'utiliser deux backticks dans ce cas
Vic
1
À moins que vous ne jouiez au golf par code, vous devriez éviter cela. L'écriture string.split('')est plus claire pour la plupart des gens que [...string].
AnnanFay
1
@AnnanFay .split('')a le problème avec les caractères des plans supplémentaires (paires de substitution en UTF-16), car il se divise par unité de code UTF-16 de code plutôt que par point de code . L'opérateur de propagation et Array.from()(ma préférence) ne le font pas.
Inkling
@Inkling, je ne savais pas que c'était un problème. Merci de l'avoir signalé. Je serais toujours tenté d'écrire une fonction utilitaire pour plus de clarté.
AnnanFay
19

On dirait que j'ai 3 ans de retard à la fête ...

Malheureusement, vous ne pouvez pas, comme cela a été souligné. Voir Les chaînes JavaScript sont - elles immuables? Ai-je besoin d'un "générateur de chaînes" en JavaScript?

La prochaine meilleure chose que vous pouvez faire est de créer une "vue" ou un "wrapper", qui prend une chaîne et réimplémente toutes les parties de l'API de chaîne que vous utilisez, mais en faisant comme si la chaîne était inversée. Par exemple:

var identity = function(x){return x};

function LazyString(s) {
    this.original = s;

    this.length = s.length;
    this.start = 0; this.stop = this.length; this.dir = 1; // "virtual" slicing
    // (dir=-1 if reversed)

    this._caseTransform = identity;
}

// syntactic sugar to create new object:
function S(s) {
    return new LazyString(s);
}

//We now implement a `"...".reversed` which toggles a flag which will change our math:

(function(){ // begin anonymous scope
    var x = LazyString.prototype;

    // Addition to the String API
    x.reversed = function() {
        var s = new LazyString(this.original);

        s.start = this.stop - this.dir;
        s.stop = this.start - this.dir;
        s.dir = -1*this.dir;
        s.length = this.length;

        s._caseTransform = this._caseTransform;
        return s;
    }

//We also override string coercion for some extra versatility (not really necessary):

    // OVERRIDE STRING COERCION
    //   - for string concatenation e.g. "abc"+reversed("abc")
    x.toString = function() {
        if (typeof this._realized == 'undefined') {  // cached, to avoid recalculation
            this._realized = this.dir==1 ?
                this.original.slice(this.start,this.stop) : 
                this.original.slice(this.stop+1,this.start+1).split("").reverse().join("");

            this._realized = this._caseTransform.call(this._realized, this._realized);
        }
        return this._realized;
    }

//Now we reimplement the String API by doing some math:

    // String API:

    // Do some math to figure out which character we really want

    x.charAt = function(i) {
        return this.slice(i, i+1).toString();
    }
    x.charCodeAt = function(i) {
        return this.slice(i, i+1).toString().charCodeAt(0);
    }

// Slicing functions:

    x.slice = function(start,stop) {
        // lazy chaining version of https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/slice

        if (stop===undefined)
            stop = this.length;

        var relativeStart = start<0 ? this.length+start : start;
        var relativeStop = stop<0 ? this.length+stop : stop;

        if (relativeStart >= this.length)
            relativeStart = this.length;
        if (relativeStart < 0)
            relativeStart = 0;

        if (relativeStop > this.length)
            relativeStop = this.length;
        if (relativeStop < 0)
            relativeStop = 0;

        if (relativeStop < relativeStart)
            relativeStop = relativeStart;

        var s = new LazyString(this.original);
        s.length = relativeStop - relativeStart;
        s.start = this.start + this.dir*relativeStart;
        s.stop = s.start + this.dir*s.length;
        s.dir = this.dir;

        //console.log([this.start,this.stop,this.dir,this.length], [s.start,s.stop,s.dir,s.length])

        s._caseTransform = this._caseTransform;
        return s;
    }
    x.substring = function() {
        // ...
    }
    x.substr = function() {
        // ...
    }

//Miscellaneous functions:

    // Iterative search

    x.indexOf = function(value) {
        for(var i=0; i<this.length; i++)
            if (value==this.charAt(i))
                return i;
        return -1;
    }
    x.lastIndexOf = function() {
        for(var i=this.length-1; i>=0; i--)
            if (value==this.charAt(i))
                return i;
        return -1;
    }

    // The following functions are too complicated to reimplement easily.
    // Instead just realize the slice and do it the usual non-in-place way.

    x.match = function() {
        var s = this.toString();
        return s.apply(s, arguments);
    }
    x.replace = function() {
        var s = this.toString();
        return s.apply(s, arguments);
    }
    x.search = function() {
        var s = this.toString();
        return s.apply(s, arguments);
    }
    x.split = function() {
        var s = this.toString();
        return s.apply(s, arguments);
    }

// Case transforms:

    x.toLowerCase = function() {
        var s = new LazyString(this.original);
        s._caseTransform = ''.toLowerCase;

        s.start=this.start; s.stop=this.stop; s.dir=this.dir; s.length=this.length;

        return s;
    }
    x.toUpperCase = function() {
        var s = new LazyString(this.original);
        s._caseTransform = ''.toUpperCase;

        s.start=this.start; s.stop=this.stop; s.dir=this.dir; s.length=this.length;

        return s;
    }

})() // end anonymous scope

Démo:

> r = S('abcABC')
LazyString
  original: "abcABC"
  __proto__: LazyString

> r.charAt(1);       // doesn't reverse string!!! (good if very long)
"B"

> r.toLowerCase()    // must reverse string, so does so
"cbacba"

> r.toUpperCase()    // string already reversed: no extra work
"CBACBA"

> r + '-demo-' + r   // natural coercion, string already reversed: no extra work
"CBAcba-demo-CBAcba"

Le kicker - ce qui suit se fait sur place par des mathématiques pures, en visitant chaque personnage une seule fois, et seulement si nécessaire:

> 'demo: ' + S('0123456789abcdef').slice(3).reversed().slice(1,-1).toUpperCase()
"demo: EDCBA987654"

> S('0123456789ABCDEF').slice(3).reversed().slice(1,-1).toLowerCase().charAt(3)
"b"

Cela permet de réaliser des économies importantes s'il est appliqué à une très grande chaîne, si vous n'en prenez qu'une portion relativement petite.

Que cela en vaille la peine (par rapport à une inversion en tant que copie comme dans la plupart des langages de programmation) dépend fortement de votre cas d'utilisation et de l'efficacité avec laquelle vous réimplémentez l'API de chaîne. Par exemple, si tout ce que vous voulez, c'est faire une manipulation d'index de chaîne, ou prendre de petits slices ou substrs, cela vous fera gagner de l'espace et du temps. Cependant, si vous prévoyez d'imprimer de grandes tranches ou sous-chaînes inversées, les économies peuvent être minimes, voire pire que d'avoir fait une copie complète. Votre chaîne "inversée" n'aura pas non plus le type string, bien que vous puissiez être capable de simuler cela avec le prototypage.

L'implémentation de démonstration ci-dessus crée un nouvel objet de type ReversedString. Il est prototypé, et donc assez efficace, avec un travail presque minimal et une surcharge d'espace minimale (les définitions des prototypes sont partagées). Il s'agit d'une implémentation paresseuse impliquant un découpage différé. Chaque fois que vous exécutez une fonction comme .sliceou .reversed, il exécute des mathématiques d'index. Enfin, lorsque vous extrayez des données (en appelant implicitement .toString()ou.charCodeAt(...) ou quelque chose), il les appliquera de manière "intelligente", en touchant le moins de données possible.

Remarque: l'API de chaîne ci-dessus est un exemple et peut ne pas être implémentée parfaitement. Vous pouvez également utiliser seulement 1-2 fonctions dont vous avez besoin.

ninjagecko
la source
13

Il existe de nombreuses façons d'inverser une chaîne en JavaScript. Je note trois façons que je préfère.

Approche 1: Utilisation de la fonction inverse:

function reverse(str) {
  return str.split('').reverse().join('');
}

Approche 2: boucle à travers les caractères:

function reverse(str) {
  let reversed = '';

  for (let character of str) {
    reversed = character + reversed;
  }

  return reversed;
}

Approche 3: Utilisation de la fonction de réduction:

function reverse(str) {
  return str.split('').reduce((rev, char) => char + rev, '');
}

J'espère que ça aide :)

Hussain Thajutheen
la source
10

Lors d'une interview, on m'a demandé d'inverser une chaîne sans utiliser de variables ou de méthodes natives. Ceci est ma mise en œuvre préférée:

function reverseString(str) {
    return str === '' ? '' : reverseString(str.slice(1)) + str[0];
}
Alex Hawkins
la source
Court, simple, mais lent comme l'enfer;)
Tom
13
Zéro méthodes natives? Et alors slice? : - /
feuille
1
Utilisation intéressante de la récursivité. Ironique, c'est sur Stack Overflow. stackoverflow.com/q/2805172/265877
Alex
@Alex, vous faites valoir un bon argument. Dans certains cas, l'intervieweur vous demandera de ne pas utiliser Array.prototype.reverse().
Daniel
10

Il existe plusieurs façons de le faire, vous pouvez vérifier les éléments suivants,

1. Traditionnel pour la boucle (incrémentation):

function reverseString(str){
        let stringRev ="";
        for(let i= 0; i<str.length; i++){
            stringRev = str[i]+stringRev;
        }
        return stringRev;
}
alert(reverseString("Hello World!"));

2. Traditionnel pour la boucle (décrémentation):

function reverseString(str){
    let revstr = "";
    for(let i = str.length-1; i>=0; i--){
        revstr = revstr+ str[i];
    }
    return revstr;
}
alert(reverseString("Hello World!"));

3. Utilisation de la boucle for-of

function reverseString(str){
    let strn ="";
    for(let char of str){
        strn = char + strn;
    }
    return strn;
}
alert(reverseString("Get well soon"));

4. En utilisant la méthode du tableau forEach / high order:

function reverseString(str){

  let revSrring = "";
  str.split("").forEach(function(char){
    
    revSrring = char + revSrring;
  
  });
  return revSrring;
}
alert(reverseString("Learning JavaScript"));

5. Norme ES6:

function reverseString(str){

  let revSrring = "";
  str.split("").forEach(char => revSrring = char + revSrring);
  return revSrring;
}
alert(reverseString("Learning JavaScript"));

6. La dernière façon:

function reverseString(str){

  return str.split("").reduce(function(revString, char){
       return char + revString;
  }, "");
 
}

alert(reverseString("Learning JavaScript"));

7. Vous pouvez également obtenir le résultat en utilisant ce qui suit,

function reverseString(str){

  return str.split("").reduce((revString, char)=> char + revString, "");
 
}
alert(reverseString("Learning JavaScript"));

Maher Hossain
la source
7

Dans ES6, vous avez une option de plus

function reverseString (str) {
  return [...str].reverse().join('')
}

reverseString('Hello');
Davaakhuu Erdenekhuu
la source
6

C'est la façon la plus simple, je pense

var reverse = function(str) {
    var arr = [];
    
    for (var i = 0, len = str.length; i <= len; i++) {
        arr.push(str.charAt(len - i))
    }

    return arr.join('');
}

console.log(reverse('I want a 🍺'));

Fatih Acet
la source
3
C'est bien que vous ayez inclus un emoji dans votre exemple. De sorte que nous voyons rapidement que cela ne fonctionne clairement pas pour les emojis et beaucoup d'autres caractères unicode.
Íhor Mé
Faith, bien que votre réponse soit correcte, je ne suis pas d'accord pour dire que c'est la manière la plus simple. Les premières réponses à plusieurs utilisent Array.prototype.reverse()ce serait le moyen le plus simple, d'où la réponse la plus populaire. Bien sûr, cela nécessiterait une bonne connaissance préalable de JavaScript.
Daniel
6
var str = 'sample string';
[].map.call(str, function(x) {
  return x;
}).reverse().join('');

OU

var str = 'sample string';
console.log(str.split('').reverse().join(''));

// Sortie: 'gnirts elpmas'

Yogesh
la source
Votre partie entière de la «carte» peut être écrite comme [...str].
5

Je sais que c'est une vieille question à laquelle on a bien répondu, mais pour mon propre amusement, j'ai écrit la fonction inverse suivante et j'ai pensé la partager au cas où elle serait utile à quelqu'un d'autre. Il gère à la fois les paires de substitution et les marques de combinaison:

function StringReverse (str)
{
  var charArray = [];
  for (var i = 0; i < str.length; i++)
    {
      if (i+1 < str.length)
        {
          var value = str.charCodeAt(i);
          var nextValue = str.charCodeAt(i+1);
          if (   (   value >= 0xD800 && value <= 0xDBFF
                  && (nextValue & 0xFC00) == 0xDC00) // Surrogate pair)
              || (nextValue >= 0x0300 && nextValue <= 0x036F)) // Combining marks
            {
              charArray.unshift(str.substring(i, i+2));
              i++; // Skip the other half
              continue;
            }
        }

      // Otherwise we just have a rogue surrogate marker or a plain old character.
      charArray.unshift(str[i]);
    }

  return charArray.join('');
}

Tous les accessoires pour Mathias, Punycode et diverses autres références pour me renseigner sur les complexités de l'encodage de caractères en JavaScript.

Scott Gartner
la source
4

Vous ne pouvez pas parce que les chaînes JS sont immuables. Solution courte non en place

[...str].reverse().join``

Kamil Kiełczewski
la source
3

Si vous ne souhaitez utiliser aucune fonction intégrée. Essaye ça

var string = 'abcdefg';
var newstring = '';

for(let i = 0; i < string.length; i++){
    newstring = string[i] += newstring;
}

console.log(newstring);
jitendra rajput
la source
2

La vraie réponse est: vous ne pouvez pas l'inverser en place, mais vous pouvez créer une nouvelle chaîne qui est l'inverse.

Juste comme un exercice pour jouer avec la récursivité: parfois, quand vous allez à une interview, l'intervieweur peut vous demander comment faire cela en utilisant la récursivité, et je pense que la "réponse préférée" pourrait être "Je préfère ne pas le faire en récursivité car elle peut facilement provoquer un débordement de pile "(car il l'est O(n)plutôt que O(log n). Si tel est le cas O(log n), il est assez difficile d'obtenir un débordement de pile - 4 milliards d'éléments pourraient être traités par un niveau de pile de 32, car 2 ** 32 est 4294967296. Mais si c'est le cas O(n), il peut facilement obtenir un débordement de pile.

Parfois, l'intervieweur vous demandera toujours, "juste comme un exercice, pourquoi ne l'écrivez-vous toujours pas en utilisant la récursivité?" Et le voici:

String.prototype.reverse = function() {
    if (this.length <= 1) return this;
    else return this.slice(1).reverse() + this.slice(0,1);
}

essai:

var s = "";
for(var i = 0; i < 1000; i++) {
    s += ("apple" + i);
}
console.log(s.reverse());

production:

999elppa899elppa...2elppa1elppa0elppa

Pour essayer d'obtenir un débordement de pile, je suis passé 1000à 10000dans Google Chrome, et il a signalé:

RangeError: Maximum call stack size exceeded
non-polarité
la source
2

Les chaînes elles-mêmes sont immuables, mais vous pouvez facilement créer une copie inversée avec le code suivant:

function reverseString(str) {

  var strArray = str.split("");
  strArray.reverse();

  var strReverse = strArray.join("");

  return strReverse;
}

reverseString("hello");
tcd1980
la source
2
//es6
//array.from
const reverseString = (string) => Array.from(string).reduce((a, e) => e + a);
//split
const reverseString = (string) => string.split('').reduce((a, e) => e + a); 

//split problem
"𠜎𠺢".split('')[0] === Array.from("𠜎𠺢")[0] // "�" === "𠜎" => false
"😂😹🤗".split('')[0] === Array.from("😂😹🤗")[0] // "�" === "😂" => false
alejandro
la source
1
Cela présente l'avantage de gérer correctement les caractères de plan supplémentaires.
2

Inverser une chaîne à l'aide de fonctions intégrées

function reverse(str) {
  // Use the split() method to return a new array
  //  Use the reverse() method to reverse the new created array
  // Use the join() method to join all elements of the array into a string
  return str.split("").reverse().join("");
}
console.log(reverse('hello'));


Inverser une chaîne sans les aides

function reversedOf(str) {
  let newStr = '';
  for (let char of str) {
    newStr = char + newStr
    // 1st round: "h" + "" = h, 2nd round: "e" + "h" = "eh" ... etc. 
    // console.log(newStr);
  }
  return newStr;
}
console.log(reversedOf('hello'));

Dzenis H.
la source
2

Une petite fonction qui gère à la fois la combinaison de signes diacritiques et de caractères à 2 octets:

(function(){
  var isCombiningDiacritic = function( code )
  {
    return (0x0300 <= code && code <= 0x036F)  // Comb. Diacritical Marks
        || (0x1AB0 <= code && code <= 0x1AFF)  // Comb. Diacritical Marks Extended
        || (0x1DC0 <= code && code <= 0x1DFF)  // Comb. Diacritical Marks Supplement
        || (0x20D0 <= code && code <= 0x20FF)  // Comb. Diacritical Marks for Symbols
        || (0xFE20 <= code && code <= 0xFE2F); // Comb. Half Marks

  };

  String.prototype.reverse = function()
  {
    var output = "",
        i      = this.length - 1,
        width;

    for ( ; i >= 0; --i )
    {
      width = 1;
      while( i > 0 && isCombiningDiacritic( this.charCodeAt(i) ) )
      {
        --i;
        width++;
      }

      if (
           i > 0
        && "\uDC00" <= this[i]   && this[i]   <= "\uDFFF"
        && "\uD800" <= this[i-1] && this[i-1] <= "\uDBFF"
      )
      {
        --i;
        width++;
      }

      output += this.substr( i, width );
    }

    return output;
  }
})();

// Tests
[
  'abcdefg',
  'ab\u0303c',
  'a\uD83C\uDFA5b',
  'a\uD83C\uDFA5b\uD83C\uDFA6c',
  'a\uD83C\uDFA5b\u0306c\uD83C\uDFA6d',
  'TO͇̹̺ͅƝ̴ȳ̳ TH̘Ë͖́̉ ͠P̯͍̭O̚​N̐Y̡' // copied from http://stackoverflow.com/a/1732454/1509264
].forEach(
  function(str){ console.log( str + " -> " + str.reverse() ); }
);
  


Mise à jour

Une liste plus complète de combinaison de diacritiques est la suivante:

      var isCombiningDiacritic = function( code )
      {
        return (0x0300 <= code && code <= 0x036F)
            || (0x0483 <= code && code <= 0x0489)
            || (0x0591 <= code && code <= 0x05BD)
            || (code == 0x05BF)
            || (0x05C1 <= code && code <= 0x05C2)
            || (0x05C4 <= code && code <= 0x05C5)
            || (code == 0x05C7)
            || (0x0610 <= code && code <= 0x061A)
            || (0x064B <= code && code <= 0x065F)
            || (code == 0x0670)
            || (0x06D6 <= code && code <= 0x06DC)
            || (0x06DF <= code && code <= 0x06E4)
            || (0x06E7 <= code && code <= 0x06E8)
            || (0x06EA <= code && code <= 0x06ED)
            || (code == 0x0711)
            || (0x0730 <= code && code <= 0x074A)
            || (0x07A6 <= code && code <= 0x07B0)
            || (0x07EB <= code && code <= 0x07F3)
            || (code == 0x07FD)
            || (0x0816 <= code && code <= 0x0819)
            || (0x081B <= code && code <= 0x0823)
            || (0x0825 <= code && code <= 0x0827)
            || (0x0829 <= code && code <= 0x082D)
            || (0x0859 <= code && code <= 0x085B)
            || (0x08D3 <= code && code <= 0x08E1)
            || (0x08E3 <= code && code <= 0x0902)
            || (code == 0x093A)
            || (code == 0x093C)
            || (0x0941 <= code && code <= 0x0948)
            || (code == 0x094D)
            || (0x0951 <= code && code <= 0x0957)
            || (0x0962 <= code && code <= 0x0963)
            || (code == 0x0981)
            || (code == 0x09BC)
            || (0x09C1 <= code && code <= 0x09C4)
            || (code == 0x09CD)
            || (0x09E2 <= code && code <= 0x09E3)
            || (0x09FE <= code && code <= 0x0A02)
            || (code == 0x0A3C)
            || (0x0A41 <= code && code <= 0x0A51)
            || (0x0A70 <= code && code <= 0x0A71)
            || (code == 0x0A75)
            || (0x0A81 <= code && code <= 0x0A82)
            || (code == 0x0ABC)
            || (0x0AC1 <= code && code <= 0x0AC8)
            || (code == 0x0ACD)
            || (0x0AE2 <= code && code <= 0x0AE3)
            || (0x0AFA <= code && code <= 0x0B01)
            || (code == 0x0B3C)
            || (code == 0x0B3F)
            || (0x0B41 <= code && code <= 0x0B44)
            || (0x0B4D <= code && code <= 0x0B56)
            || (0x0B62 <= code && code <= 0x0B63)
            || (code == 0x0B82)
            || (code == 0x0BC0)
            || (code == 0x0BCD)
            || (code == 0x0C00)
            || (code == 0x0C04)
            || (0x0C3E <= code && code <= 0x0C40)
            || (0x0C46 <= code && code <= 0x0C56)
            || (0x0C62 <= code && code <= 0x0C63)
            || (code == 0x0C81)
            || (code == 0x0CBC)
            || (0x0CCC <= code && code <= 0x0CCD)
            || (0x0CE2 <= code && code <= 0x0CE3)
            || (0x0D00 <= code && code <= 0x0D01)
            || (0x0D3B <= code && code <= 0x0D3C)
            || (0x0D41 <= code && code <= 0x0D44)
            || (code == 0x0D4D)
            || (0x0D62 <= code && code <= 0x0D63)
            || (code == 0x0DCA)
            || (0x0DD2 <= code && code <= 0x0DD6)
            || (code == 0x0E31)
            || (0x0E34 <= code && code <= 0x0E3A)
            || (0x0E47 <= code && code <= 0x0E4E)
            || (code == 0x0EB1)
            || (0x0EB4 <= code && code <= 0x0EBC)
            || (0x0EC8 <= code && code <= 0x0ECD)
            || (0x0F18 <= code && code <= 0x0F19)
            || (code == 0x0F35)
            || (code == 0x0F37)
            || (code == 0x0F39)
            || (0x0F71 <= code && code <= 0x0F7E)
            || (0x0F80 <= code && code <= 0x0F84)
            || (0x0F86 <= code && code <= 0x0F87)
            || (0x0F8D <= code && code <= 0x0FBC)
            || (code == 0x0FC6)
            || (0x102D <= code && code <= 0x1030)
            || (0x1032 <= code && code <= 0x1037)
            || (0x1039 <= code && code <= 0x103A)
            || (0x103D <= code && code <= 0x103E)
            || (0x1058 <= code && code <= 0x1059)
            || (0x105E <= code && code <= 0x1060)
            || (0x1071 <= code && code <= 0x1074)
            || (code == 0x1082)
            || (0x1085 <= code && code <= 0x1086)
            || (code == 0x108D)
            || (code == 0x109D)
            || (0x135D <= code && code <= 0x135F)
            || (0x1712 <= code && code <= 0x1714)
            || (0x1732 <= code && code <= 0x1734)
            || (0x1752 <= code && code <= 0x1753)
            || (0x1772 <= code && code <= 0x1773)
            || (0x17B4 <= code && code <= 0x17B5)
            || (0x17B7 <= code && code <= 0x17BD)
            || (code == 0x17C6)
            || (0x17C9 <= code && code <= 0x17D3)
            || (code == 0x17DD)
            || (0x180B <= code && code <= 0x180D)
            || (0x1885 <= code && code <= 0x1886)
            || (code == 0x18A9)
            || (0x1920 <= code && code <= 0x1922)
            || (0x1927 <= code && code <= 0x1928)
            || (code == 0x1932)
            || (0x1939 <= code && code <= 0x193B)
            || (0x1A17 <= code && code <= 0x1A18)
            || (code == 0x1A1B)
            || (code == 0x1A56)
            || (0x1A58 <= code && code <= 0x1A60)
            || (code == 0x1A62)
            || (0x1A65 <= code && code <= 0x1A6C)
            || (0x1A73 <= code && code <= 0x1A7F)
            || (0x1AB0 <= code && code <= 0x1B03)
            || (code == 0x1B34)
            || (0x1B36 <= code && code <= 0x1B3A)
            || (code == 0x1B3C)
            || (code == 0x1B42)
            || (0x1B6B <= code && code <= 0x1B73)
            || (0x1B80 <= code && code <= 0x1B81)
            || (0x1BA2 <= code && code <= 0x1BA5)
            || (0x1BA8 <= code && code <= 0x1BA9)
            || (0x1BAB <= code && code <= 0x1BAD)
            || (code == 0x1BE6)
            || (0x1BE8 <= code && code <= 0x1BE9)
            || (code == 0x1BED)
            || (0x1BEF <= code && code <= 0x1BF1)
            || (0x1C2C <= code && code <= 0x1C33)
            || (0x1C36 <= code && code <= 0x1C37)
            || (0x1CD0 <= code && code <= 0x1CD2)
            || (0x1CD4 <= code && code <= 0x1CE0)
            || (0x1CE2 <= code && code <= 0x1CE8)
            || (code == 0x1CED)
            || (code == 0x1CF4)
            || (0x1CF8 <= code && code <= 0x1CF9)
            || (0x1DC0 <= code && code <= 0x1DFF)
            || (0x20D0 <= code && code <= 0x20F0)
            || (0x2CEF <= code && code <= 0x2CF1)
            || (code == 0x2D7F)
            || (0x2DE0 <= code && code <= 0x2DFF)
            || (0x302A <= code && code <= 0x302D)
            || (0x3099 <= code && code <= 0x309A)
            || (0xA66F <= code && code <= 0xA672)
            || (0xA674 <= code && code <= 0xA67D)
            || (0xA69E <= code && code <= 0xA69F)
            || (0xA6F0 <= code && code <= 0xA6F1)
            || (code == 0xA802)
            || (code == 0xA806)
            || (code == 0xA80B)
            || (0xA825 <= code && code <= 0xA826)
            || (0xA8C4 <= code && code <= 0xA8C5)
            || (0xA8E0 <= code && code <= 0xA8F1)
            || (code == 0xA8FF)
            || (0xA926 <= code && code <= 0xA92D)
            || (0xA947 <= code && code <= 0xA951)
            || (0xA980 <= code && code <= 0xA982)
            || (code == 0xA9B3)
            || (0xA9B6 <= code && code <= 0xA9B9)
            || (0xA9BC <= code && code <= 0xA9BD)
            || (code == 0xA9E5)
            || (0xAA29 <= code && code <= 0xAA2E)
            || (0xAA31 <= code && code <= 0xAA32)
            || (0xAA35 <= code && code <= 0xAA36)
            || (code == 0xAA43)
            || (code == 0xAA4C)
            || (code == 0xAA7C)
            || (code == 0xAAB0)
            || (0xAAB2 <= code && code <= 0xAAB4)
            || (0xAAB7 <= code && code <= 0xAAB8)
            || (0xAABE <= code && code <= 0xAABF)
            || (code == 0xAAC1)
            || (0xAAEC <= code && code <= 0xAAED)
            || (code == 0xAAF6)
            || (code == 0xABE5)
            || (code == 0xABE8)
            || (code == 0xABED)
            || (code == 0xFB1E)
            || (0xFE00 <= code && code <= 0xFE0F)
            || (0xFE20 <= code && code <= 0xFE2F)
            || (code == 0x101FD)
            || (code == 0x102E0)
            || (0x10376 <= code && code <= 0x1037A)
            || (0x10A01 <= code && code <= 0x10A0F)
            || (0x10A38 <= code && code <= 0x10A3F)
            || (0x10AE5 <= code && code <= 0x10AE6)
            || (0x10D24 <= code && code <= 0x10D27)
            || (0x10F46 <= code && code <= 0x10F50)
            || (code == 0x11001)
            || (0x11038 <= code && code <= 0x11046)
            || (0x1107F <= code && code <= 0x11081)
            || (0x110B3 <= code && code <= 0x110B6)
            || (0x110B9 <= code && code <= 0x110BA)
            || (0x11100 <= code && code <= 0x11102)
            || (0x11127 <= code && code <= 0x1112B)
            || (0x1112D <= code && code <= 0x11134)
            || (code == 0x11173)
            || (0x11180 <= code && code <= 0x11181)
            || (0x111B6 <= code && code <= 0x111BE)
            || (0x111C9 <= code && code <= 0x111CC)
            || (0x1122F <= code && code <= 0x11231)
            || (code == 0x11234)
            || (0x11236 <= code && code <= 0x11237)
            || (code == 0x1123E)
            || (code == 0x112DF)
            || (0x112E3 <= code && code <= 0x112EA)
            || (0x11300 <= code && code <= 0x11301)
            || (0x1133B <= code && code <= 0x1133C)
            || (code == 0x11340)
            || (0x11366 <= code && code <= 0x11374)
            || (0x11438 <= code && code <= 0x1143F)
            || (0x11442 <= code && code <= 0x11444)
            || (code == 0x11446)
            || (code == 0x1145E)
            || (0x114B3 <= code && code <= 0x114B8)
            || (code == 0x114BA)
            || (0x114BF <= code && code <= 0x114C0)
            || (0x114C2 <= code && code <= 0x114C3)
            || (0x115B2 <= code && code <= 0x115B5)
            || (0x115BC <= code && code <= 0x115BD)
            || (0x115BF <= code && code <= 0x115C0)
            || (0x115DC <= code && code <= 0x115DD)
            || (0x11633 <= code && code <= 0x1163A)
            || (code == 0x1163D)
            || (0x1163F <= code && code <= 0x11640)
            || (code == 0x116AB)
            || (code == 0x116AD)
            || (0x116B0 <= code && code <= 0x116B5)
            || (code == 0x116B7)
            || (0x1171D <= code && code <= 0x1171F)
            || (0x11722 <= code && code <= 0x11725)
            || (0x11727 <= code && code <= 0x1172B)
            || (0x1182F <= code && code <= 0x11837)
            || (0x11839 <= code && code <= 0x1183A)
            || (0x119D4 <= code && code <= 0x119DB)
            || (code == 0x119E0)
            || (0x11A01 <= code && code <= 0x11A06)
            || (0x11A09 <= code && code <= 0x11A0A)
            || (0x11A33 <= code && code <= 0x11A38)
            || (0x11A3B <= code && code <= 0x11A3E)
            || (code == 0x11A47)
            || (0x11A51 <= code && code <= 0x11A56)
            || (0x11A59 <= code && code <= 0x11A5B)
            || (0x11A8A <= code && code <= 0x11A96)
            || (0x11A98 <= code && code <= 0x11A99)
            || (0x11C30 <= code && code <= 0x11C3D)
            || (0x11C92 <= code && code <= 0x11CA7)
            || (0x11CAA <= code && code <= 0x11CB0)
            || (0x11CB2 <= code && code <= 0x11CB3)
            || (0x11CB5 <= code && code <= 0x11CB6)
            || (0x11D31 <= code && code <= 0x11D45)
            || (code == 0x11D47)
            || (0x11D90 <= code && code <= 0x11D91)
            || (code == 0x11D95)
            || (code == 0x11D97)
            || (0x11EF3 <= code && code <= 0x11EF4)
            || (0x16AF0 <= code && code <= 0x16AF4)
            || (0x16B30 <= code && code <= 0x16B36)
            || (code == 0x16F4F)
            || (0x16F8F <= code && code <= 0x16F92)
            || (0x1BC9D <= code && code <= 0x1BC9E)
            || (0x1D167 <= code && code <= 0x1D169)
            || (0x1D17B <= code && code <= 0x1D182)
            || (0x1D185 <= code && code <= 0x1D18B)
            || (0x1D1AA <= code && code <= 0x1D1AD)
            || (0x1D242 <= code && code <= 0x1D244)
            || (0x1DA00 <= code && code <= 0x1DA36)
            || (0x1DA3B <= code && code <= 0x1DA6C)
            || (code == 0x1DA75)
            || (code == 0x1DA84)
            || (0x1DA9B <= code && code <= 0x1E02A)
            || (0x1E130 <= code && code <= 0x1E136)
            || (0x1E2EC <= code && code <= 0x1E2EF)
            || (0x1E8D0 <= code && code <= 0x1E8D6)
            || (0x1E944 <= code && code <= 0x1E94A)
            || (0xE0100 <= code && code <= 0xE01EF);
      };
MT0
la source
Une tentative digne, mais si vous deviez analyser le fichier UnicodeData.txt, vous constateriez qu'il existe 316 de ces plages de combinaison de signes diacritiques, plutôt que 5.
M. Lister
@MrLister La solution consiste alors à modifier la isCombiningDiacriticfonction pour inclure les 316 plages; n'hésitez pas à fournir cette modification, car vous semblez avoir les données en main.
MT0
1
function reverseString(string) {
    var reversedString = "";
    var stringLength = string.length - 1;
    for (var i = stringLength; i >= 0; i--) {
        reversedString += string[i];
    }
    return reversedString;
}

la source
1

sans convertir la chaîne en tableau;

String.prototype.reverse = function() {

    var ret = "";
    var size = 0;

    for (var i = this.length - 1; -1 < i; i -= size) {

        if (
          '\uD800' <= this[i - 1] && this[i - 1] <= '\uDBFF' && 
          '\uDC00' <= this[i]     && this[i]     <= '\uDFFF'
        ) {
            size = 2;
            ret += this[i - 1] + this[i];
        } else {
            size = 1;
            ret += this[i];
        }
    }

    return ret;
}

console.log('anãnam anañam' === 'mañana mañana'.reverse());

utiliser Array.reverse sans convertir les caractères en points de code;

String.prototype.reverse = function() {

    var array = this.split("").reverse();

    for (var i = 0; i < this.length; ++i) {

        if (
          '\uD800' <= this[i - 1] && this[i - 1] <= '\uDBFF' && 
          '\uDC00' <= this[i]     && this[i]     <= '\uDFFF'
        ) {
            array[i - 1] = array[i - 1] + array[i];
            array[i] = array[i - 1].substr(0, 1);
            array[i - 1] = array[i - 1].substr(1, 1);
        }

    }

    return array.join("");
}

console.log('anãnam anañam' === 'mañana mañana'.reverse());
masakielastic
la source
Pour la deuxième version: var c = array[i-1]; array[i-1] = array[i]; array[i] = c;ne nécessite pas de concaténation de la paire de codes. De plus, la boucle for devrait commencer à 1.
MT0
La deuxième version ne fonctionne pas avec '\ud83c\ud83c\udfa5'.reverse()- elle produira la même chose que l'entrée. L'ajout ++i;dans l' ifinstruction devrait résoudre ce problème.
MT0
À la réflexion - cela ne gère pas la combinaison de signes diacritiques: 'a\u0303bc'.reverse() === 'cba\u0303'devrait revenir vrai.
MT0
1

Je pense que String.prototype.reverse est un bon moyen de résoudre ce problème; le code comme ci-dessous;

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

var str = 'this is a good example for string reverse';
str.reverse();
-> "esrever gnirts rof elpmaxe doog a si siht";
jingyinggong
la source
1

À l'aide des fonctions de tableau,

String.prototype.reverse = function(){
    return [].reduceRight.call(this, function(last, secLast){return last + secLast});
}
Darshan
la source
1
var str = "my name is saurabh ";
var empStr='',finalString='';
var chunk=[];
function reverse(str){
var i,j=0,n=str.length;
    for(i=0;i<n;++i){
        if(str[i]===' '){
            chunk[j]=empStr;
            empStr = '';
            j++;
        }else{
            empStr=empStr+str[i];
        }
    }
    for(var z=chunk.length-1;z>=0;z--){
        finalString = finalString +' '+ chunk[z];
        console.log(finalString);
    }
    return true;
}
reverse(str);
Robin
la source
Comment est-ce "en place" ??
Sudhansu Choudhary
1

Ma propre tentative originale ...

var str = "The Car";

function reverseStr(str) {
  var reversed = "";
  var len = str.length;
  for (var i = 1; i < (len + 1); i++) {  
    reversed += str[len - i];      
  }

  return reversed;
}

var strReverse = reverseStr(str);    
console.log(strReverse);
// "raC ehT"

http://jsbin.com/bujiwo/19/edit?js,console,output

AntonB
la source
1

Gardez-le au sec et simple idiot !!

function reverse(s){
let str = s;
var reverse = '';
for (var i=str.length;i>0;i--){

    var newstr = str.substring(0,i)
    reverse += newstr.substr(-1,1)
}
return reverse;
}
Sagar Munjal
la source
1

OK, assez simple, vous pouvez créer une fonction avec une boucle simple pour inverser la chaîne pour vous sans utiliser reverse(), charAt()etc. comme ceci:

Par exemple, vous avez cette chaîne:

var name = "StackOverflow";

Créez une fonction comme celle-ci, je l'appelle reverseString...

function reverseString(str) {
  if(!str.trim() || 'string' !== typeof str) {
    return;
  }
  let l=str.length, s='';
  while(l > 0) {
    l--;
    s+= str[l];
  }
  return s;
}

Et vous pouvez l'appeler comme:

reverseString(name);

Et le résultat sera:

"wolfrevOkcatS"
Alireza
la source