JavaScript: The Good Parts 독서 노트 (4)

4. 배열 과 정규 표현 식
 
  • 배열:    일반적인 프로 그래 밍 언어 에서 배열 은 선형 으로 분 배 된 메모 리 를 표시 합 니 다. 정 수 를 통 해 오프셋 을 계산 하고 그 중의 요 소 를 방문 합 니 다.이런 상황 에서 배열 은 매우 빠 른 데이터 구조 이다.불 행 히 도 자 바스 크 립 트 는 수조 와 같은 데이터 구조 가 없다.오히려 자바 script 은 배열 과 유사 한 대상 을 제공 하 는데 이 대상 들 은 배열 의 특징 을 가 진 방법 을 포함한다.그것 은 배열 의 아래 표 시 를 문자열 로 바 꾸 어 속성 으로 한다.그것 은 진정한 의미 의 배열 보다 현저히 느 리 지만, 그것 은 더욱 편리 하 게 사용 할 수 있다.    배열 대상 의 속성 접근 방식 은 일반적인 대상 과 같 지만 정 수 를 속성 명 으로 할 수 있 는 특성 이 있 습 니 다.배열 도 글자 변 수 를 사용 하여 표시 할 수 있다.
    var empty = [];
    var numbers = ['one','two','three','four','five','six','seven','eight','nine','ten'];
    
    document.writeln(empty[1]); // undefined
    document.writeln(numbers[1]); // 'two'
    
    document.writeln(empty.length); //  0
    document.writeln(numbers.length); // 10
      이제 배열 대상 과 일반 대상 의 차 이 를 살 펴 보 자.   
    //                 
    var numbers_obj = {
    	"0" : "one",
    	"1" : "two",
    	"2" : "three",
    	"3" : "four",
    	"4" : "five",
    	"5" : "six",
    	"6" : "seven",
    	"7" : "eight",
    	"8" : "nine",
    	"9" : "ten"
    };
    
          두 사람 은 어느 정도 비슷 한 결 과 를 얻 었 다. 그들 은 모두 10 개의 속성 을 가 진 대상 을 포함 하고 그 속성 들 은 똑 같은 이름과 값 을 가지 고 있다.하지만 이들 도 눈 에 띄 게 다르다.numbers 는 Array. prototype 에서 계승 되 고 numbersobj 는 Object. prototype 에서 계승 하기 때문에 numbers 는 많은 유용 한 방법 을 계승 했다.동시에 numbers 도 기괴 한 length 속성 을 가지 고 있 습 니 다.    대부분의 언어 에서 하나의 배열 의 요 소 는 반드시 같은 유형 이 어야 한다.그러나 자 바스 크 립 트 는 그룹 에 임의의 종류의 값 을 포함 하도록 허용 합 니 다.
    var misc = ['string', 98.6, true, false, null, undefined,
    				['nested','array'], {object:true} ,NaN ,Infinity];
    document.writeln(misc.length); // 10
    
         각 배열 마다 length 속성 이 있 습 니 다.대부분의 다른 언어 와 통 하지 않 는 다.자 바스 크 립 트 그룹의 length 는 상한 이 없습니다.현재 length 보다 크 거나 같은 숫자 를 아래 표 로 저장 하면 length 는 새로운 요 소 를 수용 할 수 있 고 배열 경계 오류 가 발생 하지 않 습 니 다.(하나의 Collection 과 유사). 배열 대상 은 length 의 값 을 직접 설정 할 수 있 습 니 다.더 큰 length 를 설정 하면 배열 에 더 많은 공간 을 할당 할 필요 가 없습니다. length 를 작 게 설정 하면 모든 아래 표 시 는 새 length 와 같은 속성 이 삭 제 됩 니 다.
    numbers.length = 3; // numbers['one','two','three']
    
    //                length.                  .
    numbers[numbers.length] = 'shi'; // numbers['one','two','three','shi']
    
    //          push      :
    numbers.push('wu'); // numbers['one','two','three','shi', 'wu']
    
         자바 script 의 배열 은 사실 대상 이 고 그 중의 요 소 는 대상 의 속성 이기 때문이다.그래서 delete 연산 자 를 사용 하여 배열 에서 요 소 를 제거 할 수 있 습 니 다.  
    delete numbers[2]; // numbers['one','two', undefined ,'shi', 'wu']
       불 행 히 도, 그러면 배열 에 구멍 이 하나 남는다.이 때 splice 방법 을 사용 하여 후속 요 소 를 앞으로 나 아 갈 수 있 습 니 다.   
    numbers.splice(2,1); // numbers['one','two','shi', 'wu']
        splice (연결) 와 slice (분할) 를 구분 하 십시오. slice () 방법 은 배열 을 수정 하지 않 고 하위 배열 로 돌아 갑 니 다. splice () 방법 은 배열 을 직접 수정 합 니 다.   length 이 속성의 값 은 이 배열 의 최대 정수 속성 명 에 1 을 더 한 것 입 니 다.그러나 그것 이 반드시 배열 의 속성의 개수 와 같 지 는 않다 (!!) 
    var myArray = [];
    document.writeln(myArray.length); // 0
    myArray[100000] = true;
    document.writeln(myArray.length); // 100001
    
         [] 접두사 아래 표 연산 자 는 표현 식 을 문자열 로 변환 합 니 다. 이 표현 식 에 toString () 방법 이 있 으 면 이 방법의 값 을 사용 합 니 다.이 문자열 은 속성 명 으로 사 용 될 것 입 니 다.    아니면 자바 script 의 배열 이 대상 이기 때문에 For in 문 구 는 한 배열 의 모든 속성 을 옮 겨 다 닐 수 있 습 니 다. 그러나 for in 문 구 는 속성의 순 서 를 보장 할 수 없습니다.그래서 순 서 를 확보 해 야 할 경우 for 순환 을 사용 해 야 합 니 다.    자바 script 프로 그래 밍 에서 흔히 볼 수 있 는 오 류 는 배열 을 사용 해 야 할 때 대상 을 사용 하 는 것 입 니 다.대상 을 사용 해 야 할 때 는 배열 을 사용 했다.헷 갈 리 지 않도록 속성 명 이 작고 연속 적 인 정수 일 때 배열 을 사용 해 야 합 니 다.그렇지 않 으 면 사용 대상.    자바 script 자체 가 배열 과 대상 의 차이 에 대해 혼 란 스 럽 습 니 다. type of 연산 자 는 배열 을 조작 할 때 'object' 를 되 돌려 줍 니 다. 대부분의 경우 의미 가 없습니다.
    // Javascript                  。           is_array      :
    var is_array = function(value){
    	return value && typeof value === 'object' && value.constructor === Array;
    };
    
    document.writeln(is_array([]));
    document.writeln(is_array({}));
    
       위 판단 은 서로 다른 창 (window) 이나 프레임 (frame) 에서 구 성 된 배열 을 식별 하 는 데 실 패 했 습 니 다.만약 외부 배열 을 정확하게 검사 하려 면 우 리 는 더 많은 일 을 해 야 한다.
    var is_array_enhanced = function(value){
    return value && 
    		typeof value === 'object' &&
    		typeof value.length === 'number' &&
    		typeof value.splice === 'function' &&
    		//            (for in     ),      ,   false.
    		!(value.propertyIsEnumerable('length'));
    };
    document.writeln(is_array_enhanced([]));
    document.writeln(is_array_enhanced({}));
    
     

  • 정규 표현 식    자바 script 의 많은 특성 은 다른 언어 에서 참고 합 니 다.문법 은 자바 에서 참고 하고 함 수 는 Lisp 에서 참고 하 며 원형 계승 은 Self 에서 참고 합 니 다. 자바 script 의 정규 표현 식 은 펄 에서 참고 합 니 다.    Javascript 에서 정규 표현 식 처리 에 사용 할 수 있 는 방법 은 regexp. exec, regexp. test, string. match string. replace, string. search 와 string. split 입 니 다. 주의해 야 할 때 Javascript 에서 글자 변 수 를 표현 하 는 정규 표현 식 은 여러 줄 을 지원 하지 않 기 때문에 한 줄 로 써 야 합 니 다.
    var parse_url = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#([\s\S]*))?$/;
    // (?: ...)         。    ?           。
    //                  ,            ,       (?:...)  ,
    //                             ,                。
    //  JavaScript Java ,              $1,$2,$3...      !
    //      ()       ?:     regexp                  
    
    var url = "http://www.ora.com:80/goodparts?q#fragment";
    var result = parse_url.exec(url);
    var names = ['url','scheme','slash','host','port','path','query','bash'];
    var blanks = '    ';
    var i ;
    document.writeln('<br />');
    for(i = 0 ; i < names.length;i++){
    	document.writeln(names[i]+":"+blanks.substring(names[i].length),result[i]);
    	document.writeln('<br />');
    }
    
       RegExp 대상 을 만 들 수 있 는 두 가지 방법 이 있 습 니 다.이전의 예 에서 우 리 는 우선 글자 표 량 표현법 을 사용 하 는 것 을 보 았 다.정규 표현 식 문자 변 수 는 한 쌍 의 슬 래 쉬 에 둘러싸 여 있 습 니 다 (/... /). JS 에서 슬 래 쉬 도 나눗셈 연산 자 와 주석 부호 로 사 용 됩 니 다.   빌 드 할 때 선택 할 수 있 는 표지 가 3 개 있 습 니 다.     G (golbal) 전역 적 (여러 번 일치)     대소 문 자 를 무시 합 니 다.     M (Multiline) 다 중 줄 모드 (^ $와 일치 하 는 줄 끝 문자)

    좋은 웹페이지 즐겨찾기