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 함 수 를 다시 호출 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.