한 문장에 대한 요약 : 원래 값은 변수 할당 또는 함수 패스 여부에 관계없이 원래 값을 변경하지 않습니다. 가변 할당이든 함수 패스이든, 새 변수가 재 할당되면 원래 참조 값에 영향을 미치지 않습니다. 새 변수가 직접 작동 인 경우 원래 참조 값에 영향을 미칩니다.
우선, 값과 유형은 두 가지 다른 개념이라는 것이 분명합니다. 예를 들어, NULL은 NULL 유형의 고유 한 값이며 정의되지 않은 유형의 고유 한 값은 정의되지 않은 유형의 고유 한 값이며, True와 False는 부울 유형의 유일한 값입니다. 모든 언어에서는 값의 작동이 다음 3 가지 측면으로 요약 될 수 있습니다.
복사 값 : 즉, 값을 새 변수에 할당하거나 변수를 통해 다른 변수, 속성 또는 배열 요소에 값을 할당하십시오.
전달 값 : 즉, 값을 함수 또는 메소드에 매개 변수로 전달합니다.
값 비교 : 즉, 값을 다른 값과 비교하여 동일인지 확인하십시오.
값 유형 데이터와 기준 데이터의 값은 다른 형태를 가지므로 자연스럽게 작동하는 방법과 생성 된 결과도 다릅니다. 값이 값 유형 데이터 일 때, 우리는 종종 그것을 원래 값 또는 기본 값이라고 부릅니다. 값이 참조 된 데이터 인 경우 종종 참조 값 또는 복합 값이라고합니다.
1. 원래 값을 사용하십시오
원래 값의 경우, 3 가지 수준의 작동 수준은 다음과 같이 설명됩니다.
1) 값을 복사하십시오
과제 명세서에서 운영 프로세스는 실제 값의 사본을 생성합니다. 사본의 값과 실제 값 사이에는 연결이 없습니다. 그것들은 다른 스택 영역이나 힙 구역에만 있습니다. 이 사본은 변수, 객체의 속성 및 배열 요소를 저장할 수 있습니다. 예를 들어:
var n = 123, a, b = [], c = {}; a = n; // 숫자 123 b [0] = n을 복사합니다. // 숫자 123 cx = n을 복사합니다. // 숫자 123 (a == b [0]) && (a == cx) && (b [0] == cx) && alert ( "복사 된 값은 같다")를 복사합니다. // 값이 동일하다는 것을 감지합니다위의 예에서, 값 (123은 변수 A, 어레이 B 및 객체 C에 각각 3 개의 사본을 복사한다. 그들의 가치는 같지만 서로 독립적입니다.
2) 값을 전달하십시오
값을 함수 또는 메소드로 전달할 때 전달 된 값은 값 자체가 아닌 사본 일뿐입니다. 예를 들어, 함수에서 전달 된 값을 수정하면 결과는이 매개 변수 값의 사본에만 영향을 줄 수 있으며 원래 값에 영향을 미치지 않습니다.
var a = 123; // 원래 값 함수 f (x) {x = x + x; } f (a); // 전달 된 값 알림 (a)을 수정하려면 함수를 호출합니다. // 변수 A의 값이 영향을 받는지 확인하십시오. 반환 값은 123이므로 변경 사항이 없음을 나타냅니다.3) 비교 값
위의 예에서 우리는 원래 값을 비교할 때 바이트 바이트 비교가 수행되어 동등한 지 여부를 확인할 수 있습니다. 값이있는 위치가 아니라 값 자체를 비교합니다. 비교 결과는 동일 할 수 있지만, 그들이 포함하는 바이트 정보가 동일하다는 것을 의미합니다.
2. 참조 값을 사용하십시오
참조 값의 경우, 3 가지 수준의 운영은 다음과 같이 설명됩니다.
1) 값을 복사하십시오
할당 문에서 지정된 값은 원래 값 사본이 아닌 원래 값 또는 원래 값 자체에 대한 참조입니다. 즉, 할당이 수행 된 후 변수는 원래 값 (즉, 원래 값의 저장 주소)에 대한 참조를 저장합니다. 여러 변수, 배열 요소 또는 객체 속성 사이에 복사되면 모두 원래 변수에 의해 저장된 참조와 동일합니다.
모든 참조는 동일한 효과와 기능을 가지며 수행 할 수 있습니다. 참조 중 하나를 통해 데이터가 편집되면이 수정은 원래 값 및 기타 관련 참조에 반영됩니다. 예를 들어:
var a = [1,2,3]; // 배열 기준 할당 b = a; // 값 b [0] = 4 복사; // 변수 b alert (a [0])에서 첫 번째 요소의 값을 수정합니다. // 리턴 4, 변수 a의 첫 번째 요소 값도 4로 수정되었음을 표시합니다.
그러나 새 값이 변수 b로 재 할당되면 새 값은 원래 값의 내용에 영향을 미치지 않습니다. 예를 들어:
var a = [1,2,3]; // 배열 기준 할당 b = a; // 값 b = 4 복사; // 할당 경고를 덮어 씁니다 (a [0]); // 변수 A의 내용은 변경되지 않은 상태로 유지됩니다
반복 된 과제는 실제로 원래 값에 대한 변수의 참조를 무시하고 다른 값의 사본 또는 이에 대한 참조가됩니다. 따라서 원래 값에는 영향을 미치지 않으며 데모 다이어그램은 그림 4-2에 나와 있습니다.
2) 값을 전달하십시오
참조가 데이터를 함수로 전달하는 데 사용되면 함수로 전달 된 기능은 원래 값에 대한 참조입니다. 함수는이 참조를 사용하여 원래 값 자체를 수정할 수 있으며 함수 외부에는 모든 수정이 표시됩니다. 예를 들어:
var a = [1,2,3]; 함수 f (x) {x [0] = 4; // 함수에서 매개 변수 값을 수정} f (a); // 참조 값 알림을 전달합니다 (a [0]); // 4, 원래 값이 변경됩니다함수 내부에서 수정 된 것은 객체 또는 배열 자체의 값이 아니라 외부 객체 또는 배열에 대한 참조입니다. 참조를 사용하여 객체의 속성 또는 함수 내 배열의 요소를 수정할 수 있지만 기능 내에서 새로운 참조가 원래 참조를 덮어 쓰는 데 사용되면 함수 내부의 수정은 원래 참조의 값에 영향을 미치지 않으며 함수 외부에서는 볼 수 없습니다.
var a = [1,2,3]; 함수 f (x) {x = 4; // 함수에서 매개 변수 값을 수정} f (a); // 참조 값 알림을 전달합니다 (a [0]); // 반환 1, 원래 값은 변경되지 않습니다3) 비교 값
두 가지 참조 값을 비교할 때, 두 참조 주소는 원래 값이 동일한 바이트인지 아닌지가 아닌 동일한 사본인지 확인하기 위해 비교됩니다. 두 가지 다른 값을 참조 할 때는 동일한 바이트 구성이 있지만 두 참조의 값은 동일하지 않습니다.
var a = 새 번호 (1); // 참조 값 A var b = 새 번호 (1); // 기준 값 b var c = a; // c alert (a == b)에 대한 참조를 할당합니다. // 거짓 경고를 반환합니다 (a == c); // true를 반환합니다
{} == {}, [] == [], 모두 false를 반환합니다. 참조 주소가 다르기 때문에.
요컨대, 모든 언어의 경우 값을 사용하고 참조를 사용하는 것은 데이터 조작의 두 가지 기본 방법입니다. 데이터를 작동 할 때 데이터를 사용하여 처리 해야하는 방법은 주로 데이터 유형에 따라 다릅니다. 값 유형 및 참조 데이터는 운영에 참여합니다. 값 유형 데이터는 값을 사용하여 데이터에서 작동하는 반면, 참조 데이터는 참조를 사용하여 데이터에서 작동합니다. 다른 계산 방법은 자연스럽게 다른 결과를 생성합니다. 다른 예를 살펴 보겠습니다.
var s = "abc"; // 문자열, 값 유형 데이터 var o = 새 문자열; // 문자열 객체, 박스형 문자열 함수 f (v) {// 작동 함수 v.toString = function () {// method toString toString () return 123; }; } f (s); // 값 알림을 전달합니다. // 문자열 "ABC"를 반환하여 작업이 원래 데이터 F (O)에 영향을 미치지 않았 음을 나타냅니다. // 참조 경고를 전달합니다 (O); // 값을 반환하여 작업이 원래 데이터의 내부 구조에 영향을 미쳤음을 나타냅니다.값 유형은 실제 값으로 작업에 참여하므로 원래 데이터와 직접 연결되지 않습니다. 참조 유형은 참조 주소와 함께 작동에 참여하며 계산 결과는 참조 주소와 관련된 힙 영역 데이터 블록에 영향을 미칩니다. 그러나 한 가지 예외가 있습니다. JavaScript 문자열의 경우 작동 방법이 비교적 복잡합니다. 자세한 내용은 Google을주세요!
위의 기사 JavaScript Data Operation_A 원래 값 및 참조 값 작동의 본질에 대한 간단한 토론은 내가 공유하는 모든 내용입니다. 나는 당신이 당신에게 참조를 줄 수 있기를 바랍니다. 그리고 당신이 wulin.com을 더 지원할 수 있기를 바랍니다.