이 제목은 발음하기가 다소 혼란스럽기는 하지만 데이터 구조를 이해하는 데 핵심이 됩니다. 제목의 네 가지 용어에 해당하는 영어 용어는 얕은 복사본(섀도 복사본이 아님 참고), 깊은 복사본, 값으로 전달, 참조로 전달(또는 주소로 전달)입니다. 주소로 전달하는 것과 참조로 전달하는 것은 동일합니다.
프로그래밍 언어의 핵심은 데이터 구조입니다. 대략적으로 말하면 데이터 구조는 불변형(immutable)과 가변형(mutable)으로 나눌 수 있습니다. 왜 이렇게 나뉘어져 있나요? 여기에는 메모리 할당 문제가 포함됩니다. 불변형의 경우 제한된 메모리 공간만 할당하면 되고, 불변형의 경우 이론적으로 크기 제한 없이 공간을 할당하면 됩니다. 따라서 이 분류는 시스템 자원의 합리적인 사용을 기반으로 합니다. 실제로 힙 메모리와 스택 메모리는 각각 불변 타입 값과 가변 타입 값을 저장하는 데 사용됩니다.
불변 유형이란 무엇인가요? 즉, 값이 변수에 할당되면 해당 변수에만 속하고 다른 변수에는 속할 수 없습니다. 예:
window.onload=function( )
{
var stringValue = "light";
var anotherStringValue = stringValue;
stringValue = "변경했습니다";// 출력 변경됨
alert(anotherStringValue);//희미한 출력
이때 anotherStringValue에 저장된 값도 "변경되었습니다"가 되나요? 습관.
var anotherStringValue = stringValue;
는 stringValue에 저장된 문자열을 그대로 복사하고(따라서 메모리에 새 공간을 할당함) 문자열을 anotherStringValue로 대체하기 때문입니다. 즉, 이 두 변수는 동일한 값을 보유하지만 해당 값은 동일한 메모리에 있지 않습니다. 따라서 변수를 수정해도 다른 변수에는 영향을 미치지 않습니다. 즉,
stringValue = "변경했습니다";
는 stringValue 값에만 영향을 미칩니다. 그러나 정확하게 말하면 stringValue = "I have Changed";는 stringValue를 수정하지 않지만 새 문자열을 생성한 다음(따라서 메모리에 새 공간을 할당함) stringValue가 문자열을 참조하도록 합니다. 변수; 원래 문자열은 어떻습니까? 참조하는 변수가 없기 때문에 쓰레기가 된다(물론 쓰레기가 차지하는 메모리는 재활용된다).
불변 유형의 경우 할당 작업이 값 자체를 메모리에 전송하는 것을 볼 수 있습니다. 그렇다면 변경 가능한 유형은 어떻습니까? 물론 전달되는 것은 메모리에 있는 값의 참조(또는 주소)이며, 전달된 횟수에 관계없이 메모리에는 항상 원래 값의 복사본이 하나만 있습니다. 변수 유형은 예측할 수 없으며 원래 값의 복사본을 하나만 저장하면 저장 메모리 공간을 최대화할 수 있습니다. 예:
window.onload=function( )
{
var objectValue = {1:1,'s':'string','innerObject':{'innerArray' : [1,2,3]}}; var anotherObjectValue = objectValue ;
objectValue[1] = 100;
alert(anotherObjectValue[1]); //출력 100
}
여기서 anotherObjectValue를 얻습니다. 할당 작업을 통해 objectValue에서 원본 개체({1:1,'s':'string','innerObject':{'innerArray' : [1,2,3]}})에 대한 참조만 가져옵니다. , 메모리 주소의 개체 또는 "집 번호"입니다. 따라서 objectValue(objectValue[1] = 100;)를 통해 원본 개체의 첫 번째 요소를 수정하면 anotherObjectValue[1]에도 반영됩니다. 이는 이 두 변수가 동일한 원래 값을 공유하기 때문입니다.
JavaScript에서 매개변수를 함수에 전달하는 것은 위의 기본 규칙을 따릅니다. 즉, 불변 유형의 경우 값으로 전달하고, 변수 유형의 경우 주소로 전달합니다. 예:
function example(str, obj){
......
}
example(stringValue,objectValue)
예제를 호출할 때 함수에서 전달되는 첫 번째 매개변수는 실제 문자열 값이고, 두 번째 매개변수에는 객체에 대한 참조(메모리 주소)가 전달됩니다.