기본 값과 참조 값 ECMAScript에서 변수는 기본 값과 참조 값이라는 두 가지 유형의 값을 저장할 수 있습니다.
프리미티브 값이란 원시 데이터 유형(기본 데이터 유형)을 나타내는 값, 즉 Undefine, Null, Number, String, Boolean 유형으로 표현되는 값을 의미합니다.
참조값은 복합 데이터 유형의 값, 즉 Object, Function, Array, Custom Object 등의 값을 말합니다.
스택 및 힙
참조 값은 스택과 힙이라는 두 가지 메모리 구조에 해당합니다.
스택은 후입선출 방식의 데이터 구조입니다. JavaScript에서는 스택의 동작을 시뮬레이션할 수 있습니다. 배열을 통해
var arr = [] / /스택 생성
arr.push("apple");/ /"apple" 요소 푸시 ["apple"]
arr.push("orange") //"orange" 요소 푸시 [ "apple","orange"]
arr.pop(); //"orange" ["apple"] 팝업
arr.push("banana");//"banana" 요소를 푸시합니다. ["apple","banana"]
us 해당 메모리 맵을 살펴보겠습니다.
원래 값은 즉, 해당 값은 변수 액세스 위치에 직접 저장됩니다.
힙은 데이터를 저장하는 해시 알고리즘 기반의 데이터 구조입니다. 자바스크립트에서는 참조 값이 힙에 저장됩니다.
참조 값은 힙에 저장된 객체, 즉 변수에 저장된 값(즉, 스택에 저장된 객체를 가리키는 변수)은 힙에 저장된 실제 객체를 가리키는 포인터입니다.
예: var obj = new Object(); obj는 스택에 저장되고 힙에 저장된 new Object() 객체를 가리킵니다.
그렇다면 왜 참조 값은 힙에 있고 원래 값은 스택에 있지 않습니까? 그렇다면 왜 그 질문에 대한 답을 탐구해 볼까요?
우선 코드를 살펴보겠습니다.
기능 사람(id,name,age){
this.id = id;
this.name = 이름
this.age = age; num = 10;
var bol = true;
var str = "abc";
var obj = new Object()
var arr = ['a','b','c '];
var person = new Person(100,"jxl",22);
그럼 메모리 분석 다이어그램을 살펴보겠습니다.
num, bol, str 변수는 기본 데이터 유형이며 해당 값은 스택에 직접 저장됩니다. obj, person 및 arr은 복합 데이터 유형이며 스택에 저장된 실제 개체를 가리킵니다. 힙.
위 그림에서 알 수 있듯이 힙에 있는 데이터를 직접 조작할 수는 없습니다. 즉, 객체를 직접 조작할 수는 없지만 스택에 있는 객체에 대한 참조를 통해 객체를 조작할 수 있다는 의미입니다. , 리모콘을 통해 조작하는 것과 같습니다. TV와 동일하지만 차이점은 TV 자체에는 제어 버튼이 없다는 점입니다.
이제 참조 값이 힙에 배치되고 원래 값이 스택에 배치되는 이유에 대한 질문에 대답해 보겠습니다.
한 문장을 기억하세요. 에너지는 보존됩니다. 공간을 교환하는 시간, 공간을 교환하는 시간의 문제일 뿐입니다.
힙은 스택보다 크고, 스택은 힙보다 빠르게 작동하며 객체는 복잡한 구조이며 자유롭게 확장할 수 있습니다. 예를 들어 배열은 무한히 확장될 수 있으며, 객체는 자유롭게 속성을 추가할 수 있습니다. 스택의 효율성에 영향을 주지 않도록 힙에 배치됩니다. 대신 참조를 통해 힙에 있는 실제 객체를 찾아 연산을 수행합니다. 단순 데이터 유형에 비해 단순 데이터 유형은 상대적으로 안정적이며 적은 양의 메모리만 차지합니다. 단순 데이터 유형이 힙에 배치되지 않는 이유는 참조를 통해 힙에서 실제 객체를 찾는 데 시간이 걸리고, 이 종합적인 비용이 스택에서 직접 실제 값을 얻는 데 드는 비용보다 훨씬 크기 때문입니다. 따라서 단순 데이터 유형의 값은 스택에 직접 저장됩니다.
요약:
프로그램은 매우 간단하지만 모든 것의 기초가 됩니다. 초고층 빌딩도 벽돌 하나하나 쌓아가기 때문입니다.
기억은 프로그램 실행의 기초입니다. 기억을 이해한다는 것은 모든 것을 이해한다는 것을 의미합니다.
이것은 당신의 노력입니다. 스스로를 격려하고 어서!
참고:
JavaScript 고급 프로그래밍