holdanddeepdive/javascript-deep-dive

10장, 11장

Opened this issue · 0 comments

객체리터럴

  1. 프로퍼티 접근법에 마침표 표기법과 대괄호 표기법이 있는데 대괄호 표기법 자주 사용하시는지 궁금합니다.(131p)
  • person['name']

원시값과 객체 비교

  • 객체
    • 자바스크립트 객체 관리 방식(146p)
      "대부분의 자바스크립트 엔진은 해시테이블과 유사하지만 높은 성능을 위해 일반적인 해시테이블보다 나은 방법으로 객체를 구현한다."
      -> 더 나은 방법이 뭔지 궁금해서 찾아보았습니다.

JS객체의 구현

  • JS의 객체는 Hash table처럼 동작함 -> 엔진은 내부에서 객체를 어떻게 구현할까?
  • V8에서 객체와 배열을 다루는 방식
    • JS의 객체는 property를 가진다.
      • properties의 분류
        • key가 정수인 Indexed Properties
        • key가 문자열인 Named Properties
          -> 즉 배열은 key가 int인 딕셔너리다.
          -> 따라서 아래와 같은 원소의 추가가 가능하다.
             let listA = [1];
             // [1]
             listA[2] = 3.3;
             // (3) [1, empty, 3.3]
             listA[1] = '2.2';
             // (3)[1, '2.2', 3.3]

          하지만 이런식의 추가가 배열의 상태를 조작이 느려지도록 바꿀 수 있어 권장하지 않음

          • Array의 속성
            PAKCED(꽉찬배열) or HOLEY(중간이 비어있는 배열)
            SMI_ELEMENTS or DOUBLE_ELEMENTS
          • 처음 배정받은 Array의 속성을 유지하는 쪽으로 배열을 관리하는 것이 좋다.
  • JS는 동적타이핑 언어
    * 런타임에 데이터의 타입이 바뀔 수 있음
    * 동적서치가 반복되면 비용이 많이 들기 때문에 이를 줄이기 위한 최적화 방법이 Hidden class
    • Hidden class

      • 객체의 프로퍼티를 최신값을 가리키는 포인터들의 모임
      • 언제 사용?
        • 코드가 엔진을 통해 바이너리코드로 조합되기 전, 함수와 모듈은 그 자체의 내용의 복사본으로 교체됨
        • 객체는 자주 치환되어야하는 상황에는 정보를 미리 캐시에 담아둠
          -> 객체가 호출될때마다 참조를 찾아가는 것이 아니라 캐시에서 바로 꺼내쓸 수 있음
          -> 이때 Hidden class를 사용함
          -> 최신상태를 유지하는데에 해시 테이블이 적절하지 않기 때문에 구현하지 않는 것
    • array 상태변경 체크 flag
      --trace-elements-transitions


    1. 책에 나온 링크
    2. 그외 자료