최근 "JavaScript Advanced Programming"에 대한 연구에서 문자열의 특성에 대한 설명이 있습니다. 원본 텍스트는 대략 다음과 같습니다. ecmascript의 문자열은 불변입니다. 변수의 저장된 문자열을 변경하려면 먼저 원래 문자열을 파괴 한 다음 변수를 새 값을 포함하는 다른 문자열로 채 웁니다.
코드 사본은 다음과 같습니다.
var lang = "Java";
lang = lang + "스크립트";
이 작업을 구현하는 프로세스는 다음과 같습니다. 먼저 10자를 보유 할 수있는 새 문자열을 작성한 다음이 문자열에서 "Java"및 "Script"로 채 웁니다. 마지막 단계는 원래 문자열 "Java"와 "Script"를 파괴하는 것입니다.이 두 줄은 쓸모가 없기 때문입니다. 그러나 더 낮은 버전의 브라우저 (예 : IE6)에서 문자열 스 플라이 싱 속도는 성능 저렴한 프로세스입니다.
이것으로부터 나는 Java를 생각합니다. Java의 문자열 메커니즘은 JS와 유사합니다 (즉, 생성 후에는 변경할 수 없으며 변경하려면 원래 값 만 파괴 할 수 있습니다). 그러나 Java는 String 불변성 문제를 해결하는 StringBuffer를 가지고 있으며 JS는 비슷한 방법을 가지고 있지 않습니다. 그러나이 버퍼링 메커니즘을 시뮬레이션 할 수 있습니다. 원칙은 스 플라이 싱에 배열을 사용하는 것입니다. 소스 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
함수 stringBuffer () {
this .__ strings__ = new Array ();
}
StringBuffer.prototype.append = function (str) {
이 .__ 문자열 __. 푸시 (str);
이것을 반환하십시오; // 편리한 체인 작동
}
StringBuffer.prototype.toString = function () {
이 .__ 문자열 __. join ( "");
}
/*시험*/
var buffer = new StringBuffer ();
buffer.append ( "Hello"). Append ( "JavaScript");
var result = buffer.toString ();
경고 (결과);
PS : 요점 주소는 다음과 같습니다
우리는 메커니즘을 시뮬레이션했지만이 방법과 문자열 스 플라이 싱 사이에는 성능에 차이가 있습니다. 테스트 할 수 있으며 테스트 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
var d1 = 새로운 날짜 ();
var str = "";
for (var i = 0; i <10000; i ++) {
str += "텍스트";
}
var d2 = 새로운 날짜 ();
document.write ( "하나의 비용 테스트 :" + (d2.gettime () -d1.gettime ())/1000 + "seconds" + "<br/>");
var obuffer = new StringBuffer ();
d3 = 새로운 날짜 ();
for (var i = 0; i <10000; i ++) {
obuffer.append ( "텍스트");
}
var sresult = obuffer.toString ();
d4 = 새로운 날짜 ();
documb
테스트 결과는 다음과 같습니다. (테스트 결과는 다른 환경에서 다를 수 있습니다) :
1.베이스와 1000 배를 비교할 때, 두 가지 실행은 매우 빠르며 (기본 밀리 초)는 거의 동일합니다. 후자의 전자 간의 차이는 10 밀리 초를 초과하지 않습니다.
2. 기본으로 10,000 배인 실행 결과는 위와 유사하지만 전자는 IE6에 따라 더 많은 전화 요금을 가지고 있습니다.
3.베이스로 10 만 배, IE6의 문자열 스 플라이 싱에는 분명히 더 많은 시간이 걸리고 다른 브라우저는 크게 다르지 않으며 일부는 StringBuffer보다 짧습니다.
결론적으로
1. 스 플라이 싱 단어의 수가 1,000 배 미만인 경우, 전자를 대담하게 사용하면 수천 개의 스 플라이 싱 시간이 거의 발생하지 않습니다.
2. 다른 브라우저에는 스 플라이 싱에 성능 문제가 없습니다. 스 플라이 싱 시간이 수만 또는 수십만 달러의 비용이 들면 StringBuffer를 사용하여 IE6 만 시뮬레이션하는 것이 좋습니다.