개발정리

javascript / Chapter6. 배열 본문

JS/javascript

javascript / Chapter6. 배열

성구님 2017. 2. 26. 23:06
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

00 들어가며

01 배열리터럴

02 length속성

03 삭제

04 열거

05 객체와 배열의 혼동

06 배열의 메소드

07 배열의 크기와 차원

 

00 들어가며

  • 배열이란
    • 항목의 오프셋을 계산 할 수 있는 정수를 통해 각 항목들을 접근 할 수 있는 연속적인 메모리 할당
    • 매우 빠른 데이터 구조
  • 하지만 자바스크립트에는 이런 배열은 없다.
  • 자바스크립트의 배열은 배열같은 객체
  • 느리지만 사용은 편리하다.

 

01 배열 리터럴

  • var arr = [];   // 기본적인 배열 리터럴
    arr = [
        'first',
        'second'
    ];
      
    var obj = {
        '0' 'first',
        '1' 'second'
    };
    // 배열처럼 보이는 객체
  • 두 객체의 차이점
    • obj는 Object.prototype을 상속받는다.
    • arr은 Array.prototype을 상속받는다.
      • 따라서 추가적인 기능을 제공한다.

 

02 length 속성

  • 자바스크립트 배열 length의 특징
    • 다른 언어와 다르게 상계 기반이 아니다.
    • 최대 속성 크기보다 하나 더 큰 값.

      var arr = [];   //length는 1
      arr[10000] = true;
      console.log(arr.length);    //length는 10001
    • 따라서 속성의 갯수 != length
    • length는 명시적으로 변환 가능하다.
      • length값을 증가시켜도 메모리 할당은 일어나지 않는다.
      • length값을 감소시키면 해당 length 이후의 속성은 삭제된다.
  • 새로운 항목 추가시
    • length값을 활용해 추가가능
    • push사용

 

03 삭제

  • delete 연산자를 사용한 삭제
    • 배열에 구멍이 생긴다.
  • splice 메소드 사용
    • 삭제된 배열 속성의 오른쪽 속성을 재 삽입.
    • 배열이 큰 경우 빠르지 않다.

 

04 열거

  • for in문으로 열거 가능
    • 적합하지 않다.
    • 배열의 순서가 보장되지 않음.
    • prototype chain에 있는 예상치 못한 값이 열거될 수 있다.
  • for문을 사용해 열거하는 것이 좋다.

 

05 객체와 배열의 혼동

  • 배열이 필요할 때와 객체가 필요할 때 구분
    • 속성이름이 작은 크기의 연속된 정수일 때 배열을 사용한다.
    • 아니라면 객체를 사용한다.
  • 배열의 type of는 object이다.
    • 자바스크립트 또한 배열과 객체를 혼동한다.
    • 두 객체를 구분하기 위해 다음과 같은 함수 제작이 가능하다.

      var is_array function (value) {
          return value &&
              type of value === 'object' &&
              value.constructor === Array;
      };
      // 위의 함수는 다른 창이나 프레임에서 생성한 배열은 구분하지 못한다.
        
      var is_array function (value) {
          return value &&     // value가 존재하는지
              type of value === 'object' &&   //객체이거나 배열이거나 null
              type of value.length === 'number' &&    //length속성이 존재하는가
              type of value.splice === 'function' &&  //splice속성이 존재하는가
              !(value.propertyIsEnumerable('length'));    //length속성이 열거가 불가능 한가?
      };

06 배열의 메소드

  • Array.prototype을 통해 메소드 추가 가능

    Array.method('reduce'function(f, value) {
        var i;
        for (i = 0 ; i < this.length ; i++) {
            value = f(this[i], value);
        }
        return value;
    });
    // 배열을 대상으로 연산할 수 있는 메소드

 

07 배열의 크기와 차원

  • 자바스크립트 배열은 보통 초기화 되지 않는다.
  • [ ] 은 빈 배열
  • 존재하지 않는 값 접근 시 undefined
  • 배열에 문자가 없도록 Array.dim같은 메소드가 있어야 했다.

    Array.dim = function (dimension, initial) {
        var a = [], i;
        for (i = 0 ; i < dimension ; i++) {
            a[i] = initial;
        }
        return a;
    };
      
    var arr = Array.dim(10, 0); // 10개의 속성을 0으로 초기화한 배열
  • 다차원 배열은 없지만 다음과 같이 사용 가능하다

    var matrix = [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9]
    ];
      
    console.log(matrix[0][0]); // 1
      
    // 또는
      
    for (var i = 0 ; i < n; i++) {
        arr[i] = [];
    }
  • 다차원 배열의 초기화용 dim인 matrix

    Array.matrix = function (m, n, init) {
        var a, i, j, mat = [];
     
        for (i = 0 ; i < m ; i++) {
            a = [];
            for (j = 0 ; k < n ; j++) {
                    a[j] = init
            }
            mat[i] = a;
        }
        return mat;
    };





참고문헌

1. 더글라스 크락포드, 김명신  자바스크립트 핵심가이드 javascript The good parts』, 한빛미디어




'JS > javascript' 카테고리의 다른 글

Chapter8 메소드  (0) 2017.04.09
javascript / Chapter7. 정규 표현식  (0) 2017.02.26
javascript / Chapter5. 상속  (0) 2017.02.26
javascript / Chapter4. 함수 2  (0) 2017.02.08
javascript / Chapter4. 함수 1  (0) 2017.01.31
Comments