JS 정규 표현 식 글자 의 양 과 new RegExp 구조 함 수 를 사용 하여 만 든 정규 표현 식 은 어떤 차이 가 있 습 니까?

우 리 는 js 에서 문자 로 만 바 꿀 때 자주 두 가지 쓰기,직접 글자 의 양 을 만 날 수 있다.
1、str.replace(/ /ig,"");
2.new RegExp 방식
테스트 코드

<form name=form1> 
   :<input name="t1" value="123456"> 
  :/<input name="t2" value="^\d*$">/ 
</form> 
<script language=javascript> 
function c1() 
 { 
 re=new RegExp("^\d*$"); 
 alert(re.test("123456")); 
 } 
function c2(form) 
 { 
 re=new RegExp(form.t2.value); 
 alert(re.test(form.t1.value)); 
} 
function c3(){ 
 re=/^\d*$/; 
 alert(re.test("123456")); 
 } 
 c1(); 
 c2(document.form1); 
 c3(); 
</script> 
위의 코드 결 과 는 FALSE,TRUE,TRUE 입 니 다.
결과 중 에 왜 제일 먼저 FALSE 였 어 요?
첫번째   re=new   RegExp("^\\d*$");     
 \따옴표 에 전의 가 필요 하 다.
첫 번 째 는 쌍 따옴표 가 있 고,쌍 따옴표 는 한 번 더 전의 해 야 하 며,두 번 째 는 없다.이것 이 바로 차이 이다. 
그러나 오늘 보기에 한 편의 문장 은 복잡 한 종류의 교체 에 대해 여전히 new 로 쓴다.전제 도 정규 를 잘 최적화 해 야 한다.
예전 에는 뉴 대상 보다 글자 의 양 이 효율 적 이 라 고 말 하 는 글 을 많이 봤 지만 정규 에 서 는 그렇지 않 은 것 같다.
그러나 이 관점 을 직접적 으로 부인 할 수 는 없다.왜냐하면 나 는 항상 글자 로 양 을 재고 간결 하고 아름 다 우 며 사용 하기에 편리 한 것 이 왕도 이기 때문이다.
데이터 양 이 많 거나 반복 작업 횟수 가 많 을 때 new RegExp 를 사용 하 는 것 이 필요 하 다 고 생각 합 니 다.
성능 이 이렇게 향상 되 는 것 도 봤 으 니까.
물론 전제조건 은 당신 의 정규 가 반드시 최적화 되 어야 한 다 는 것 이다.정규 가 최적화 되 지 않 은 상황 은 두 가지 차이 가 많 지 않다.
그래서 당신 의 정규 를 최적화 한 다음 에 new RegExp 를 사용 하면 프로그램의 성능 을 대폭 향상 시 킬 수 있 습 니 다.
PS:IE 11 은 특례 입 니 다.이 물건 은 지금까지 표준 에 맞 게 출시 된 적 이 없습니다.
자,오늘 의 나 눔 이 끝 났 으 니 너희들 은 모두 꿈 틀 꿈 틀 움 직 이 고 있 지?어서 가서 정규 각종 new 를 일 으 켜 라.
JS 정규 표현 식 을 사용 하 는 글자 의 양 과 RegExp 구조 함 수 를 사용 하여 만 든 정규 표현 식 은 어떤 차이 가 있 습 니까?
아래 의 내용 은 어떤 책 에서 발췌 한 것 이다.
정규 표현 식 의 글자 크기 를 사용 하 는 것 은 RegExp 구조 함 수 를 사용 하여 만 든 정규 표현 식 과 다 릅 니 다.ECMAScript 3 에 서 는 정규 표현 식 글자 의 양 이 항상 같은 RegExp 인 스 턴 스 를 공유 하고 구조 함수 로 만 든 모든 새로운 RegExp 인 스 턴 스 는 새로운 인 스 턴 스 입 니 다.아래 의 예 를 보시오.

var re = null,
  i;
for (i=0; i < 10; i++){
 re = /cat/g;
 re.test("catastrophe");
}
for (i=0; i < 10; i++){
 re = new RegExp("cat", "g");
 re.test("catastrophe");
}
첫 번 째 순환 에 서 는 순환 체 에서 지정 하 더 라 도 실제/cat/만 RegExp 인 스 턴 스 를 만 들 었 습 니 다.인 스 턴 스 속성 이 초기 화 되 지 않 기 때문에 순환 에서 test()방법 을 다시 호출 하 는 데 실 패 했 습 니 다.첫 번 째 호출 test()에서"cat"을 찾 았 지만 두 번 째 호출 은 색인 이 3 인 문자(지난번 일치 하 는 끝)에서 시작 되 었 기 때문에 찾 을 수 없습니다.문자열 의 끝 까지 테스트 하기 때문에 다음 에 test()를 호출 하면 다시 시작 합 니 다.
두 번 째 순환 은 RegExp 구조 함 수 를 사용 하여 순환 할 때마다 정규 표현 식 을 만 듭 니 다.매번 교체 할 때마다 새로운 RegExp 인 스 턴 스 를 만 들 기 때문에 test()를 호출 할 때마다 true 로 돌아 갑 니 다.
못 알 아 봤 어 요.다음 두 가지 방법 으로 테스트 를 해 봤 는데 모두 10 번 이나 트 루 로 돌 아 왔 네요.
ES5 기준 을 놓 고 말 하지 않 으 면 ES3 라면 첫 번 째 상황 은 5 번,두 번 째 상황 은 10 번 이 라 고 하 는 것 일 까?

var re = null,
 b = 0,
 c = 0,
 tmp,
 i;
for (i=0; i < 10; i++){
 re = /cat/g;
 tmp = re.test("catastrophe");
 console.log(tmp);
 if(tmp){
  b++ ;
 }
}
for (i=0; i < 10; i++){
 re = new RegExp("cat", "g");
 tmp = re.test("catastrophe");
 console.log(tmp);
 if(tmp){
  c++;
 }
}
console.log(b,c);
너 자신 도 그것 이 ES3 의 기준 이 라 고 말 했 는데,지금 은 ES5 가 모두 보급 되 었 고,ES6 의 출현 도 머지않아 있 을 것 이다.
ES5 표준 에 서 는 어떤 방식 이 든 독립 된 정규 표현 식 을 만 듭 니 다.현대 브 라 우 저 는 일반적으로 ES5 를 지원 합 니 다.
이제 ECMA 5.1 을 봐 야 하기 때문에 기준 중 명확 하 게 지적 하 다 입 니 다.
A regular expression literal is an input element that is converted to a RegExp object (see 15.10) each time the literal is evaluated. Two regular expression literals in a program evaluate to regular expression objects that never compare as === to each other even if the two literals' contents are identical.
정규 표현 식 은 글자 의 양 이 계 산 될 때마다 정규 대상 으로 변 환 됩 니 다.내용 이 일치 하 더 라 도 이 대상 들 은 같 지 않 습 니 다.

좋은 웹페이지 즐겨찾기