JavaScript에서 문자열을 어떻게 뒤집습니까?


435

이 (내장 함수 사용하지 않고, return 문으로 함수에 전달 될 때 어떻게 자바 스크립트에서 장소 (또는 장소)의 문자열을 반대합니까 .reverse(), .charAt()등)?


따라서 문자열의 문자를 얻기 위해 .charAt ()을 사용할 수 없습니까?
Irwin

155
당신은 할 수 없습니다. JavaScript 문자열은 변경할 수 없으므로 각각에 할당 된 메모리를 쓸 수 없으므로 진정한 "제자리에서"반전이 불가능합니다.
Crescent Fresh

2
다시 : crescentfresh의 의견을보십시오 stackoverflow.com/questions/51185/…
baudtack 5

1
@ crescentfresh 당신은 그것을 새로운 답변으로 게시해야합니다.
baudtack 2016

답변:


736

간단한 ASCII 문자를 다루고 내장 함수를 사용하는 것이 좋으면 다음과 같이 작동합니다.

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

UTF-16 또는 기타 멀티 바이트 문자를 지원하는 솔루션이 필요한 경우이 함수는 유효하지 않은 유니 코드 문자열 또는 재미있는 문자열을 제공합니다. 대신이 답변 을 고려할 수 있습니다 .

[... s]는 유니 코드를 인식하고 작은 편집으로 다음을 제공합니다.

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

44
대리 쌍 (예 : 기본 다국어 평면 외부의 문자)이 포함 된 UTF-16 문자열에서는이 오류가 발생합니다. 또한 결합 문자를 포함하는 문자열에 대해 재미있는 결과를 제공합니다. 예를 들어 분음 기호는 다음 문자에 나타날 수 있습니다. 첫 번째 문제는 유효하지 않은 유니 코드 문자열로 이어지고 두 번째 문제는 재미있게 보이는 문자열입니다.
Martin Probst

2
@Richeve Bebedor "내장 함수를 사용하지 않고 모두? .reverse ()"JS에서 문자열을 되돌릴 수있는 실용적인 솔루션 임에도 불구하고 이것은 문제의 범위에 맞지 않기 때문에 받아 들일 수있는 해결책이 아닙니다.
David Starkey

1
@DavidStarkey : 그렇습니다. 거의 4 년이 지난 후에 되돌아 보면, 제가 질문의 요점을 어떻게 그리워했는지보기가 어렵습니다. 방금 2 분 동안 기다렸다가 원래 게시물에 대한 초승달의 의견을지지 한 것 같습니다.
belacqua

14
@MartinProbst 내 대답은 대리 쌍을 처리하고 마크를 올바르게 결합하는 문제에 대한 유니 코드 인식 솔루션을 제공합니다. stackoverflow.com/a/16776380/96656
Mathias Bynens

1
UTF-16의 return [...s].reverse().join("");경우 작동 할 수 있습니다.
user4642212

411

다음 기술 (또는 이와 유사한 기술)은 일반적으로 JavaScript에서 문자열을 되 돌리는 데 사용됩니다.

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

실제로 지금까지 게시 된 모든 답변은이 패턴의 변형입니다. 그러나이 솔루션에는 몇 가지 문제가 있습니다. 예를 들면 다음과 같습니다.

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

왜 이런 일이 발생하는지 궁금하다면 JavaScript의 내부 문자 인코딩을 읽으십시오 . (TL; DR : 𝌆은 별표이고 JavaScript는 두 개의 별도 코드 단위로 표시합니다.)

그러나 더 있습니다 :

// 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.

문자열 역 구현을 테스트하기에 좋은 문자열 은 다음과 같습니다 .

'foo 𝌆 bar mañana mañana'

왜? 여기에는 별표 ( 𝌆) ( 자바 스크립트에서 서로 게이트 쌍으로 표시됨)와 결합 표시 ( 마지막으로 mañanaU + 006E LATIN SMALL LETTER N 및 U + 0303 COMBINING TILDE)가 포함되어 있기 때문입니다.

대리 쌍이 나타나는 순서는 되돌릴 수 없습니다. 그렇지 않으면 별표 기호가 '역전 된'문자열에 더 이상 표시되지 않습니다. 그렇기 때문에 ��이전 예제의 출력에서 해당 마크 를 보았습니다 .

결합 마크는 항상 이전 심볼에 적용되므로 주 심볼 (U + 006E 라틴 작은 문자 N)을 결합 마크 (U + 0303 조합 타일)로 전체적으로 취급해야합니다. 순서를 반대로하면 결합 표시가 문자열의 다른 기호와 쌍을 이루게됩니다. 그렇기 때문에 예제 출력이 대신했습니다 ñ.

바라건대, 이것은 지금까지 게시 된 모든 답변이 잘못된 이유를 설명합니다 .


JavaScript에서 문자열을 올바르게 바꾼 방법에 대한 초기 질문에 답하기 위해 유니 코드를 인식하는 문자열 반전이 가능한 작은 JavaScript 라이브러리를 작성했습니다. 방금 언급 한 문제가 없습니다. 라이브러리는 Esrever 라고 합니다 . 코드는 GitHub에 있으며 거의 ​​모든 JavaScript 환경에서 작동합니다. 쉘 유틸리티 / 바이너리와 함께 제공되므로 원하는 경우 터미널에서 쉽게 문자열을 되돌릴 수 있습니다.

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

"제자리"부분은 다른 답변을 참조하십시오.


65
답변에 Esrever 코드의 주요 부분을 포함시켜야합니다.
r0estir0bbe

1
@Meglio이 특정한 접근 방식으로 그렇습니다.
Mathias Bynens

8
물론 문제는 "줄을 거꾸로하는 것"이 ​​분명하게 들리지만 여기에 언급 된 문제에 직면하지 않는다는 것입니다. 인쇄 할 때 grapheme 클러스터가 문자열의 역순으로 표시되는 문자열을 반환하는 문자열을 되 돌리는가? 한편으로, 그것은 아마 들린다. 다른 한편으로는 왜 그렇게하고 싶습니까? 이 정의는 인쇄되는 내용에 달려 있으며 반전 된 문자열을 인쇄하는 것은 거의 유용하지 않습니다. 알고리즘의 일부로 요구 사항이 완전히 다를 수 있습니다.
Martijn

19
이것은 문제를 설명 하는 데 큰 도움 이되지만 실제 대답다른성에 있습니다. @의 r0estir0bbe는 1 년 전 말했듯이, 관련 코드가 있어야한다 대답, 단지 연결되지.
TJ Crowder

4
"행복하게, 이것은 지금까지 게시 된 모든 답변이 잘못된 이유를 설명합니다."-이 주장은 지나치게 강력합니다. 많은 유스 케이스에는 UTF-16 지원이 필요하지 않습니다 (예 : URL 및 URL 구성 요소 / 매개 변수에 대한 작업). 솔루션은 필요하지 않은 시나리오를 처리하지 않기 때문에 단순히 "잘못된"것이 아닙니다. 특히, 최고 투표 답변은 ASCII 문자로만 작동하므로 분명히 조금 잘못되지 않습니다.
aroth

92
String.prototype.reverse_string=function() {return this.split("").reverse().join("");}

또는

String.prototype.reverse_string = function() {
    var s = "";
    var i = this.length;
    while (i>0) {
        s += this.substring(i-1,i);
        i--;
    }
    return s;
}

String 프로토 타입에 동의합니다.
Jeff Meatball 양

3
문자열 연결은 비싸다. 배열을 만들고 결합하거나 concat ()을 사용하는 것이 좋습니다.
Bjorn 2016

2
# 1이 최고, # 2가 엄청나게 느릴 수 있음
adamJLev

9
그러나 유니 코드 복합 문자가있는 경우 솔루션이 작동하지 않습니다.
Eric Grange

2
@JuanMendes 2009 년에 그 의견을 남겼습니다. 지난 4 년 동안 상황이 바뀌 었습니다. : P
Bjorn

63

문자열과 성능 세부 정보를 반전시키는 자세한 분석 및 10 가지 방법.

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

이러한 구현의 성능 :

브라우저 당 최고의 성능 구현

  • 크롬 15-묵시 1과 6
  • Firefox 7-구현 6
  • IE 9-구현 4
  • 오페라 12-구현 9

그 구현은 다음과 같습니다.

구현 1 :

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

구현 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('');
}

구현 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('');
}

구현 4 :

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

구현 5 :

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

구현 6 :

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

구현 7 :

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

구현 8 :

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

구현 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('');
    }

구현 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));
}

53

"문자열을 뒤집어 놓는 것"전체는 구식 면접 질문 C 프로그래머이며, 그들과 면담 한 사람들 (복수, 아마도?)이 물을 것이다. 불행히도, 거의 모든 관리 언어 (JS, C # 등)의 문자열이 변경 불가능한 문자열을 사용하므로 새 위치를 지정하지 않고 문자열을 이동한다는 전체 아이디어를 무시하기 때문에 더 이상 작동하지 않는 "제자리"부분입니다.

위의 솔루션은 실제로 문자열을 되돌 리지만 더 많은 메모리를 할당하지 않으면 문자열을 뒤집지 않으므로 조건을 만족시키지 않습니다. 할당 된 문자열에 직접 액세스 할 수 있어야하고 원래 메모리 위치를 조작하여 원래 위치로 되돌릴 수 있어야합니다.

개인적으로, 나는 이런 종류의 인터뷰 질문을 정말로 싫어하지만 슬프게도 앞으로 몇 년 동안 계속해서 보게 될 것이라고 확신합니다.


7
적어도 한 인터뷰어가 JS에서 문자열을 "in-place"로 바꾸는 방법을 물었을 때 꽤 감동 받았다고 말할 수 있으며 JS의 문자열이 변경 불가능하기 때문에 왜 불가능한지 설명했습니다. 나는 그것이 그가 기대했던 답인지 아니면 내가 그를 조금 교육했는지 모른다. 어느 쪽이든 그것은 잘 작동했다;)
Chev

1
어쩌면 그는 가비지 수집기에서 "관리"를 의미 할 것입니다. 최소한 "관리 언어"또는 가상 컴퓨터 / 가상 런타임 환경이 존재한다는 의미입니까? @torazaburo
AntonB

39

먼저 Array.from()문자열을 배열로 바꾸고 배열 Array.prototype.reverse()을 뒤집은 다음 Array.prototype.join()다시 문자열로 만드는 데 사용하십시오.

const reverse = str => Array.from(str).reverse().join('');

오버 헤드가 있지만 이것은 우아한 솔루션입니다! 기존 reverse논리를 다시 쓰지 않습니다 .
Gershom

2
@felixfbecker 아니오, string.split('')작동하지 않습니다. 자세한 설명 은 이 답변 을 참조하십시오 .
Michał Perłakowski

5
이것은 유니 코드와도 작동하므로 허용되는 대답이어야합니다. 예 : 위의 예에서 :Array.from('foo 𝌆 bar mañana mañana').reverse().join('') == 'anãnam anañam rab 𝌆 oof'
Julian TF

3
@JulianTF 정확하게는 하나의 물결표가 여전히 'n'대신 'a'에 적용됩니다.
로마 보이 코

2
@RomanBoiko True이지만 문자열을 먼저 정규화 할 수 있습니다. Array.from('foo 𝌆 bar mañana mañana'.normalize('NFC')).reverse().join('')될 것이다"anañam anañam rab 𝌆 oof"
씨 리스터

26

ECMAScript 6에서는 .split('')split 연산자 를 사용하여 split 메소드 를 사용하지 않고도 문자열을 더 빠르게 되돌릴 수 있습니다 .

var str = [...'racecar'].reverse().join('');

1
ES6 또한 대신`두 역 따옴표를`사용할 수 있습니다('')

이 경우에는 두 개의 백틱을 사용할 이유가 없습니다
Vic

1
코드 골프를하지 않는 한 이것을 피해야합니다. 글을 쓰는 string.split('')것보다 대부분의 사람들에게 더 분명합니다 [...string].
AnnanFay

1
@AnnanFay .split('')는 보조 평면의 문자 (UTF-16의 대리 쌍)에 문제가 있습니다 . 코드 포인트가 아닌 UTF-16 코드 단위로 분할되기 때문 입니다. 스프레드 연산자와 (내 선호도)는 그렇지 않습니다. Array.from()
Inkling

@ Inkling 나는 그것이 문제라는 것을 몰랐다. 지적 해 주셔서 감사합니다. 나는 명확성을 위해 유틸리티 함수를 작성하고 싶어한다.
AnnanFay

19

내가 파티에 3 년 늦은 것 같아

불행히도 당신은 지적한대로 할 수 없습니다. JavaScript 문자열을 변경할 수 없습니까?를 참조하십시오 . JavaScript에서 "문자열 작성기"가 필요합니까?

다음으로 할 수있는 가장 좋은 방법은 "보기"또는 "래퍼"를 만드는 것입니다. "보기"또는 "래퍼"는 문자열을 가져와 사용중인 문자열 API의 모든 부분을 다시 구현하지만 문자열을 뒤집는 것은 반대입니다. 예를 들면 다음과 같습니다.

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

데모:

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

키커-다음은 순수한 수학으로 현장에서 이루어지며, 필요한 경우에만 각 캐릭터를 한 번만 방문합니다.

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

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

상대적으로 작은 슬라이스 만 사용하는 경우 매우 큰 줄에 적용하면 크게 절약됩니다.

이것이 가치가 있는지 (대부분의 프로그래밍 언어에서와 같이 복사로 반전)는 사용 사례와 문자열 API를 얼마나 효율적으로 다시 구현하는지에 달려 있습니다. 예를 들어 문자열 인덱스 조작을하거나 작은 slices 또는 substrs를 취 하면 공간과 시간이 절약됩니다. 그러나 큰 반전 슬라이스 또는 하위 문자열을 인쇄 할 계획이라면 전체 사본을 저장하는 것보다 훨씬 적은 비용이 절감 될 수 있습니다. "역전 된"문자열도 유형이 없습니다.string 않지만 프로토 타이핑으로 위조 할 수 있습니다.

위의 데모 구현은 ReversedString 유형의 새 객체를 만듭니다. 그것은 최소한의 작업과 최소한의 공간 오버 헤드 (시제품 정의가 공유 됨)로 프로토 타입 화되어 상당히 효율적입니다. 지연된 슬라이싱과 관련된 지연 구현입니다. .slice또는 과 같은 기능을 수행 할 때마다 .reversed인덱스 수학이 수행됩니다. 마지막으로 데이터를 추출 할 때 (암시 적으로 호출 .toString()하거나 .charCodeAt(...)다른 방식으로) 가능한 가장 적은 데이터를 건드 리면서 "스마트 한"방식으로 데이터를 적용합니다.

참고 : 위의 문자열 API는 예제이며 완벽하게 구현되지 않을 수 있습니다. 필요한 1-2 개의 기능 만 사용할 수도 있습니다.


13

JavaScript에서 문자열을 되돌릴 수있는 방법은 여러 가지가 있습니다. 내가 선호하는 세 가지 방법을 적어두고 있습니다.

접근법 1 : 역 기능 사용 :

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

접근 방식 2 : 문자 반복 :

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

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

  return reversed;
}

접근법 3 : 감소 기능 사용 :

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

이게 도움이 되길 바란다 :)


10

인터뷰 중에 변수 나 기본 메소드를 사용하지 않고 문자열을 되돌 리라는 요청을 받았습니다. 이것은 내가 가장 좋아하는 구현입니다.

function reverseString(str) {
    return str === '' ? '' : reverseString(str.slice(1)) + str[0];
}

짧고 단순하지만 지옥만큼 느리다.)
Tom

13
제로 네이티브 메소드? 무엇에 대해 slice? :-/
leaf

1
재귀의 흥미로운 사용. 스택 오버플로에 있다는 것은 아이러니합니다. stackoverflow.com/q/2805172/265877
Alex

@Alex, 당신은 좋은 지적을합니다. 어떤 경우에는 면접관이 당신에게 사용하지 말 것을 요구할 것 Array.prototype.reverse()입니다.
Daniel

10

여러 가지 방법이 있으며 다음을 확인할 수 있습니다.

1. 전통적인 for 루프 (증가) :

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

2. 전통적인 for 루프 (감소) :

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. for-of 루프 사용

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

4. forEach / high order 배열 방법 사용 :

function reverseString(str){

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

5. ES6 표준 :

function reverseString(str){

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

6. 최신 방법 :

function reverseString(str){

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

alert(reverseString("Learning JavaScript"));

7. 다음을 사용하여 결과를 얻을 수도 있습니다.

function reverseString(str){

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



6

이것이 내가 생각하는 가장 쉬운 방법입니다

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 🍺'));


3
예제에 그림 이모티콘을 포함시킨 것이 좋습니다. 이모 지와 다른 많은 유니 코드 문자에는이 기능이 제대로 작동하지 않는다는 것을 빨리 알 수 있습니다.
Íhor Mé

믿음, 당신의 대답은 정확하지만, 그것이 가장 쉬운 방법이라는 것에 동의하지 않습니다. 처음 몇 가지 답변 Array.prototype.reverse()은 가장 쉬운 방법 일 것이므로 가장 인기있는 답변입니다. 물론 JavaScript에 대한 사전 지식이 필요합니다.
Daniel

6
var str = 'sample string';
[].map.call(str, function(x) {
  return x;
}).reverse().join('');

또는

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

// 출력 : 'gnirts elpmas'


전체 '지도'부분은로 쓸 수 있습니다 [...str].

5

나는 이것이 잘 대답 된 오래된 질문이라는 것을 알고 있지만, 내 자신의 즐거움을 위해 다음과 같은 역 기능을 작성했으며 다른 사람에게 유용 할 경우 공유 할 것이라고 생각했습니다. 대리 쌍과 결합 마크를 모두 처리합니다.

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('');
}

JavaScript에서 문자 인코딩의 복잡성에 관해 Mathias, Punycode 및 기타 다양한 참고 자료에 대한 모든 소품.



3

내장 기능을 사용하지 않으려는 경우 이 시도

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

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

console.log(newstring);

2

실제 대답은 : 당신은 그것을 뒤집을 수는 없지만 그 반대 인 새로운 문자열을 만들 수 있다는 것입니다.

재귀를 사용하는 연습과 마찬가지로 : 때때로 인터뷰에 참석할 때 면접관이 재귀를 사용하여이 작업을 수행하는 방법을 물을 수도 있습니다. "선호하는 대답"은 "재귀에서는이 작업을 수행하지 않으므로 오히려 이 때문에 쉽게 ( "스택 오버 플로우를 일으킬 수 있습니다 O(n)보다는 O(log n)이됩니다. O(log n), 스택 오버플로 얻을 매우 어렵다 - 2 ** 32 4294967296와 같이 40 억 개 항목, 32의 스택 레벨에 의해 처리 될 수 있습니다. 그러나 만약 그렇다면O(n) 스택 오버플로를 쉽게 얻을 수 있습니다.

때때로 면접관은 여전히 ​​당신에게 "운동처럼 그냥 재귀를 사용하여 작성하지 않습니까?"라고 묻습니다. 그리고 여기 있습니다 :

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

시운전 :

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

산출:

999elppa899elppa...2elppa1elppa0elppa

스택 오버플로를 시도하기 위해 Chrome에서로 변경 1000하여 다음 10000과 같이보고했습니다.

RangeError: Maximum call stack size exceeded

2

문자열 자체는 변경할 수 없지만 다음 코드를 사용하여 쉽게 역 사본을 만들 수 있습니다.

function reverseString(str) {

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

  var strReverse = strArray.join("");

  return strReverse;
}

reverseString("hello");

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

1
이는 추가 평면 문자를 올바르게 처리한다는 이점이 있습니다.

2

분음 부호와 2 바이트 문자를 모두 처리하는 작은 기능 :

(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() ); }
);
  


최신 정보

분음 부호 결합의보다 완전한 목록은 다음과 같습니다.

      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);
      };

가치있는 시도이지만, UnicodeData.txt 파일을 스캔 할 경우 5가 아닌 조합 분음 부호의 범위가 316 개임을 알 수 있습니다.
Mr Lister

@MrLister 솔루션 isCombiningDiacritic은 모든 316 범위를 포함 하도록 함수를 편집하는 것입니다. 데이터를 제공하는 것으로 보이므로 수정 사항을 자유롭게 제공하십시오.
MT0

1
function reverseString(string) {
    var reversedString = "";
    var stringLength = string.length - 1;
    for (var i = stringLength; i >= 0; i--) {
        reversedString += string[i];
    }
    return reversedString;
}

1

문자열을 배열로 변환하지 않고;

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());

문자를 코드 포인트로 변환하지 않고 Array.reverse 사용;

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());

두 번째 버전의 경우 : var c = array[i-1]; array[i-1] = array[i]; array[i] = c;코드 쌍을 연결할 필요가 없습니다. 또한 for-loop는 1에서 시작해야합니다.
MT0

두 번째 버전은 작동하지 않습니다 '\ud83c\ud83c\udfa5'.reverse()-입력과 동일하게 출력됩니다. 명령문 ++i;내에 추가하면 if이 문제를 해결해야합니다.
MT0

다시 생각하면-분음 부호 조합을 처리하지 못합니다 'a\u0303bc'.reverse() === 'cba\u0303'. true를 반환해야합니다.
MT0

1

String.prototype.reverse가이 문제를 해결하는 좋은 방법이라고 생각합니다. 아래와 같은 코드;

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

1

배열 함수를 사용하여

String.prototype.reverse = function(){
    return [].reduceRight.call(this, function(last, secLast){return last + secLast});
}

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);

이것이 어떻게 "제자리에"있습니까?
Sudhansu Choudhary

1

내 자신의 원래 시도 ...

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


1

건조하고 간단하게 바보로 유지하십시오!

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;
}

1

좋아, 아주 간단합니다. 간단한 루프로 함수를 만들어서 문자열을 뒤집지 않고 사용할 수 있습니다 reverse().charAt() 같은 등 :

예를 들어 다음 문자열이 있습니다.

var name = "StackOverflow";

이와 같은 함수를 작성하십시오 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;
}

그리고 당신은 그것을 다음과 같이 부를 수 있습니다 :

reverseString(name);

결과는 다음과 같습니다.

"wolfrevOkcatS"

1

JavaScript에서 문자열을 바꾸는 가장 좋은 방법

1) Array.reverse :

당신은 아마 생각하고 있습니다, 우리가 문자열을 되돌리고 있다고 생각했는데 왜 Array.reverse 메소드를 사용하고 있습니까? String.split 메소드를 사용하여 문자열을 문자 배열로 변환합니다. 그런 다음 배열의 각 값 순서를 바꾸고 마지막으로 Array.join 메서드를 사용하여 배열을 다시 문자열로 변환합니다.

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

2) while 루프 감소 :

매우 장황하지만이 솔루션은 솔루션 1보다 장점이 있습니다. 배열을 만들지 않고 소스 문자열의 문자를 기반으로 문자열을 연결하기 만합니다.

성능 관점에서 볼 때 아마도 테스트되지 않은 최상의 결과를 얻을 수 있습니다. 매우 긴 문자열의 경우 성능 향상으로 인해 창에서 벗어날 수 있습니다.

function reverseString(str) {
    var temp = '';
    var i = str.length;

    while (i > 0) {
        temp += str.substring(i - 1, i);
        i--;
    }


    return temp;
}
reverseString('dwayne');

3) 재귀

이 솔루션이 얼마나 간단하고 명확한 지 사랑합니다. String.charAt 및 String.substr 메소드는 문자열이 비어있을 때까지 매번 호출하여 다른 값을 전달하는 데 사용되는 것을 분명히 알 수 있습니다. . 이것은 아마도 두 번째 솔루션 다음으로 두 번째로 최고의 성능을 얻을 것입니다.

function reverseString(str) {
    return (str === '') ? '' : reverseString(str.substr(1)) + str.charAt(0);
}
reverseString('dwayne');
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.