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

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



답변

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

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

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

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

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


답변

다음 기술 (또는 이와 유사한 기술)은 일반적으로 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'

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


답변

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


답변

문자열과 성능 세부 정보를 반전시키는 자세한 분석 및 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));
}


답변

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

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

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


답변

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

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


답변

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

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