JS 의 창고 와 더미

5135 단어
데이터 구 조 를 배 운 학생 들 은 창고 와 더미 에 대해 다소 알 고 있 죠?모 르 셔 도 괜 찮 습 니 다. JS 의 스 택 과 더미 도 마찬가지 입 니 다 ^ ^,창고 와 더미 가 얼마나 신성 한 지..
창고 와 더미
스 택 (stack): 스 택 은 자동 으로 메모리 공간 을 분배 하고 자동 으로 방출 되 며 기본 형식, 간단 한 데이터 세그먼트 를 저장 하여 고정 크기 의 공간 을 차지 합 니 다.기본 유형: String, Number, Boolean, Null, Undefined
더미 (hep): 동적 으로 분 배 된 메모리, 크기 가 일정 하지 않 아 도 자동 으로 방출 되 지 않 습 니 다. 인용 형식 을 저장 합 니 다. 여러 값 으로 구 성 될 수 있 는 대상 을 말 합 니 다. 메모리 에 저장 하고 인용 형식 을 포함 하 는 변 수 를 말 합 니 다. 실제 저장 하 는 것 은 변수 자체 가 아니 라 이미지 에 대한 지침 입 니 다.인용 유형: 함수, 배열, 개체
구별
스 택: 모든 방법 에서 정 의 된 변 수 는 스 택 메모리 에 있 습 니 다. 방법 이 실 행 됨 에 따라 이 방법의 메모리 스 택 도 자 연 스 럽 게 삭 제 됩 니 다.
장점: 액세스 속도 가 쌓 이 는 것 보다 빠 르 고 CPU 에 직접 있 는 레지스터 에 버 금 가 며 데 이 터 를 공유 할 수 있 습 니 다.단점: 창고 에 존재 하 는 데이터 의 크기 와 생존 기간 은 반드시 확정 적 이 고 유연성 이 부족 해 야 한다.
더미: 메모리 에 있 는 대상 은 방법의 끝 에 따라 소각 되 지 않 습 니 다. 방법 이 끝 난 후에 도 이 대상 은 다른 인용 변수 에 의 해 인 용 될 수 있 습 니 다 (매개 변수 전달).대상 을 만 드 는 것 은 반복 적 으로 이용 하기 위해 서 입 니 다. 이 대상 은 실행 중인 데이터 영역 에 저 장 됩 니 다.
창고 와 더미 의 넘 침
스 택: 재 귀적 호출 방법 을 사용 할 수 있 습 니 다. 이렇게 스 택 깊이 가 증가 함 에 따라 JVM 은 긴 방법 으로 궤적 을 호출 하고 메모리 가 분배 되 지 않 아 스 택 이 넘 치 는 것 을 알 수 있 습 니 다.더미: 대상 을 순환 적 으로 만 듭 니 다. 통속 적 인 점 은 끊 임 없 는 new 대상 입 니 다.
다음은 전달 값 과 전달 주소 의 차 이 를 살 펴 보 겠 습 니 다. 사실 이 두 가지 차 이 는 기본 유형 과 인용 유형의 차이 입 니 다. 말 을 많이 하지 않 고 밤 을 보 겠 습 니 다.
var a = [1,0,9,8,7];
   var b = a;
   var c = a[0];
   console.log(b);     //[1,0,9,8,7]
   console.log(c);     //1
   //    
   b[1] = 3;
   c = 5;
   console.log(b[1]);  //3
   console.log(a[0]);  //1 

a 는 배열 이 고 인용 형식 이기 때문에 b 에 게 부여 할 때 스 택 의 주 소 를 전달 합 니 다. 메모리 의 대상 이 아 닙 니 다. c 는 a 더미 메모리 에서 얻 은 데이터 값 일 뿐 스 택 에 저 장 됩 니 다. 따라서 b 가 수정 할 때 주소 에 따라 a 더미 로 돌아 가 수정 합 니 다. c 는 스 택 에서 수정 하고 a 더미 메모리 에 직접 연결 하여 수정 할 수 없습니다.
깊이
심도 있 는 복사 본 은 전단 면접 에서 자주 질문 을 받 습 니 다. 여러분 과 공유 하 겠 습 니 다. 먼저 얕 은 복사 본 에 대해 말씀 드 리 겠 습 니 다. 즉, 1 층 속성 만 복사 한 것 입 니 다. 복사 대상 은 기본 유형 이 기본 유형 을 복사 할 때 등 번 호 를 직접 사용 하여 완성 합 니 다. 인용 유형 을 복사 할 때 대상 을 옮 겨 다 니 며 각 속성 이나 값 에 대해 등 번 호 를 사용 하여 완성 합 니 다.
다음은 밤.
var color1 = ['red','green']; 
        var color2 = [];
        //  
        for(var i  = 0;i < color1.length;i++){
          color2[i] = color1[i]; 
        }
        console.log(color2);  //[red,green]
        color1.push('black');
        console.log(color2);  //[red,green]

이 밤 에 color 2 는 color 1 을 복사 합 니 다. 배열 의 모든 항목 이 기본 형식 (string) 이기 때 문 입 니 다. 만약 에 배열 의 한 항목 이 하나의 대상 이거 나 하나의 배열 이거 나 대상 의 특정한 속성 이 하나의 대상 (즉, 인용 유형의 특정한 속성 또는 인용 유형) 이 라면 이때 얕 은 복사 가 소 용이 없습니다. 그러면 어떻게 해 야 합 니까?인용 유형 속성 인지 인용 유형 밤 인지 먼저 살 펴 보 겠 습 니 다.
var person = {
    name : 'wang',
    score:{
            math:100,
        English:100
        }
    }

위 에 있 는 이 작은 밤 중에서 score 속성 은 하나의 대상 이다.
다음은 우리 의 복사 입 니 다. 이 제 는 깊 은 복사 가 나 와 야 합 니 다..........................................................................
function cloneObject (obj) {
     var newObj = {}  //        ,    
      if (typeof (obj) !== 'object') {
          return obj
     }
     //       ,    
    else{
        for (var attr in obj) {
        //            ,    
        newObj[attr] = cloneObject(obj[attr])
                }
       }
    return newObj
  }

딥 복사 에 대해 서 는 인용 형식 인지 여 부 를 판단 합 니 다. 그렇지 않 으 면 대상 의 속성 을 순환 적 으로 옮 겨 다 니 며, 어떤 속성 이 인용 형식 이 라면 이 속성 에 대해 deepClone 함 수 를 다시 호출 합 니 다.

좋은 웹페이지 즐겨찾기