>  기사  >  웹 프론트엔드  >  JavaScript 문자열 곱셈_javascript 기술

JavaScript 문자열 곱셈_javascript 기술

WBOY
WBOY원래의
2016-05-16 18:47:561404검색

원본 주소: http://www.davidflanagan.com/2009/08/string-multipli.html
원저자: David Flanagan
In Ruby 에서 "*" 연산자는 문자열을 왼쪽 매개변수로 사용하고 숫자를 오른쪽 매개변수로 사용하여 문자열 반복을 구현합니다. 예를 들어, "Ruby" * 2의 값은 "RubyRuby"입니다. 이는 몇 가지 위치(예: 하이픈과 같은 ASCII 문자 테이블 생성)에서만 유용하지만 매우 간결합니다. 그리고 문자열을 n번 연결하는 루프를 작성하는 것보다 낫습니다. 이는 매우 비효율적으로 보입니다.

방금 JavaScript에서 문자열 곱셈을 수행하는 영리한 방법을 발견했습니다.

코드 복사 코드

String.prototype.times = function(n) {
return Array.prototype.join.call({length:n 1}, this); ;
"js".times(5) // => "jsjsjsjs"


이 메소드는 요소가 모두 "정의되지 않은" 배열을 호출하는 것입니다. 행동. 그러나 실제로 n 1개의 "정의되지 않은" 요소가 있는 배열을 생성하지는 않습니다. 이는 Array 객체의 프로토타입 함수인 Join()에 의존하여 길이 속성을 포함하는 익명 객체를 사용합니다. "Object"는 배열이 아니기 때문에 Join()을 직접 호출할 수 없으므로 프로토타입의 call()을 통해 구현해야 합니다. 동일한 효과를 갖는 간단한 버전은 다음과 같습니다.


코드 복사 코드는 다음과 같습니다.
String.prototype.times = function(n) { return (new Array(n 1)).join(this);}

Array의 생성자를 호출할 때 매개변수는 배열의 길이를 설정하기만 하고 배열의 요소를 실제로 생성하지는 않습니다.

Firefox에서만 테스트했고 일반 루프보다 더 효율적일 것으로 예상하지만 벤치마킹하지는 않았습니다.

저자 소개
David Flanagan은 Java 글쓰기에 푹 빠진 컴퓨터 프로그래머입니다. 그는 대부분의 시간을 Java 관련 책을 쓰는 데 보냅니다. David는 MIT에서 컴퓨터 과학 및 엔지니어링 학위를 받았습니다. 그는 시애틀과 밴쿠버 사이의 미국 태평양 북서부 해안에 살고 있습니다. 그의 베스트셀러 O'Reilly 저서로는 Java in a Nutshell, Java Foundation Classes in a Nutshell, Java Enterprise in a Nutshell, JavaScript: The Definitive Guide, JavaScript Pocket Reference 및 The Ruby 프로그래밍 언어 등이 있습니다.

내 의견
효율성이 중요하다면 루프 반복을 약간 최적화하는 것이 더 효율적일 수 있습니다. 예를 들어, 다음 재귀 호출의 알고리즘 복잡도는 O(log2n)입니다. Google Chrome에서의 테스트 결과는 David의 방법보다 빠르게 실행된다는 것입니다. 그러나 그의 방법이 매우 우아하다는 점은 인정해야 합니다!

코드 복사 코드는 다음과 같습니다.
String.prototype.times = function(n ) {
if (n == 1 ) {
return this;
}
var midRes = this.times(Math.floor(n/2))
midRes = midRes;
if ( n % 2 ) {
midRes = this;
}
return midRes;
}

Postscript
David가 내 제안을 채택했습니다. 그는 우리를 위해 비재귀 버전을 작성했습니다. 그의 블로그의 원본 텍스트를 참조하십시오: http://www.davidflanagan.com/2009/08/good-algorithms.html
연락처 정보
내 이메일, 저에게 연락을 환영합니다(redraiment@gmail.com). )
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.