js 에서 인용 전달 과 값 전달
값 에 따라 전달 (callby value) 은 가장 자주 사용 하 는 값 을 구 하 는 정책 입 니 다. 함수 의 형 삼 은 호출 될 때 전 달 된 실제 인삼 의 사본 입 니 다.형 삼 의 값 을 수정 하 는 것 은 결코 실 삼 에 영향 을 주지 않 는 다.
인용 에 따라 전달 (call by reference) 할 때 함수 의 형 삼 은 실제 인삼 의 암시 적 인용 을 받 습 니 다. 더 이상 사본 이 아 닙 니 다.함수 형 삼 의 값 이 수정 되면 실 삼 도 수정 된다 는 뜻 이다.동시에 둘 은 같은 값 을 가리킨다.
인용 에 따라 전달 하면 함수 호출 추적 이 더욱 어렵 고 미묘 한 BUG 를 일 으 킬 수도 있다.
값 에 따라 전달 하 는 것 은 매번 복제 복사 본 이 필요 하기 때문에 복잡 한 유형 에 대해 성능 이 비교적 낮다.두 가지 가치 전달 방식 은 모두 각자 의 문제 가 있다.
우 리 는 먼저 C 의 예 를 보고 값 과 인용 에 따라 전달 하 는 차 이 를 알 아 보 자.
void Modify(int p, int * q) {
p = 27; // - p a , p
*q = 27; // q b ,q b
}
int main() {
int a = 1;
int b = 1;
Modify(a, &b); // a , b ,
// a , b
return(0);
}
여기 서 우 리 는 볼 수 있다.
JS 값 의 전달 방식 탐구
JS 의 기본 유형 은 값 에 따라 전달 된다.
var a = 1;
function foo(x) {
x = 2;
}
foo(a);
console.log(a); // 1, x = 2
다시 대상 보기:
var obj = {x : 1};
function foo(o) {
o.x = 3;
}
foo(obj);
console.log(obj.x); // 3, !
o 와 obj 가 같은 대상 임 을 설명 합 니 다. o 는 obj 의 사본 이 아 닙 니 다.그 러 니까 값 대로 전달 하 는 게 아니 라그러나 이 는 JS 의 대상 이 인용 에 따라 전달 되 었 다 는 것 을 설명 하 는 것 일 까?우 리 는 다음 의 예 를 다시 보 자.
var obj = {x : 1};
function foo(o) {
o = 100;
} foo(obj);
console.log(obj.x); // 1, obj 100.
인용 에 따라 전달 되 는 것 이 라면, 형 삼 o 의 값 을 수정 하 는 것 은 실 삼 에 영향 을 주어 야 한다.그러나 여기 서 o 의 값 을 수정 하 는 것 은 obj 에 영향 을 주지 않 습 니 다.따라서 JS 의 대상 은 인용 에 따라 전달 되 는 것 이 아니다.과연 대상 의 값 은 JS 에서 어떻게 전달 되 는 것 일 까?
공유 에 따라 call by sharing 전달
정확히 말 하면 JS 의 기본 유형 은 값 에 따라 전달 되 고 대상 유형 은 공유 에 따라 전달 된다 (call by sharing, 대상 에 따라 전달 되 고 대상 에 따라 공유 전달 된다).최초 로 Barbara Liskov. 가 1974 년 GLU 언어 에서 제기 했다.이 값 구하 기 정책 은 Python, Java, Ruby, JS 등 다양한 언어 에 사용 된다.
이 정책 의 중점 은 함수 전 참 을 호출 할 때 함수 가 대상 의 실제 참조 사본 을 받 아들 이 는 것 입 니 다 (값 에 따라 전달 하 는 대상 사본 도 아니 고 인용 에 따라 전달 하 는 암시 적 참조 도 아 닙 니 다).이 는 인용 에 따라 전달 하 는 것 과 달리 공유 전달 에서 함수 형 삼 에 대한 할당 은 실제 인삼 의 값 에 영향 을 주지 않 습 니 다.아래 의 예 에서 형 삼 o 의 값 을 수정 함으로써 obj 의 값 을 수정 할 수 없습니다.
var obj = {x : 1};
function foo(o) {
o = 100;
}
foo(obj);
console.log(obj.x); // 1, obj 100.
그러나 인용 은 사본 이지 만 인용 대상 은 같다.이들 은 같은 대상 을 공유 하기 때문에 형 삼 대상 의 속성 치 를 수정 하면 실 삼 의 속성 치 에 도 영향 을 줄 수 있다.
var obj = {x : 1};
function foo(o) {
o.x = 3;
} foo(obj);
console.log(obj.x); // 3, !
대상 유형 에 대해 대상 이 가 변 적 (mutable) 이기 때문에 수정 대상 자체 가 공유 대상 의 인용 과 인용 복사 본 에 영향 을 줄 수 있 습 니 다.기본 유형 에 대해 서 는 가 변 적 이지 않 은 (immutable) 이기 때문에 공유 에 따라 전달 하 는 것 과 값 에 따라 전달 하 는 것 (call by value) 은 차이 가 없 기 때문에 JS 기본 유형 은 값 에 따라 전달 하 는 것 도 맞 고 공유 에 따라 전달 하 는 것 도 맞다.
var a = 1; // 1. number 형식 입 니 다. 가 변 적 이지 않 은 var b = a;b = 6;
공유 전달 에 따 르 면 a 와 b 는 서로 다른 인용 (b 는 a 의 인용 사본) 이지 만 같은 값 을 참조 합 니 다.이곳 의 기본 유형 인 숫자 1 은 변 할 수 없 기 때문에 값 에 따라 전달 하고 공유 에 따라 전달 하 는 것 은 아무런 차이 가 없다 고 한다.
기본 유형의 불가 변 (immutable) 성질
기본 유형 은 가 변 적 이지 않 습 니 다 (immutable). 대상 만 가 변 적 입 니 다 (mutable). 예 를 들 어 숫자 값 100, 불 값 true, false 등 값 을 수정 하 는 것 은 의미 가 없습니다.오해 하기 쉬 운 것 은 JS 의 string 입 니 다.때때로 우 리 는 문자열 의 내용 을 바 꾸 려 고 시도 하지만, JS 에 서 는 string 값 에 대한 수정 으로 보 이 는 모든 작업 이 실제 적 으로 새로운 string 값 을 만 듭 니 다.
var str = "abc";
str[0]; // "a"
str[0] = "d";
str; // "abc"; 。
상 대 는 달라 지고, 상 대 는 가 변 적 이다.
var obj = {x : 1};
obj.x = 100;
var o = obj;
o.x = 1;
obj.x; // 1, o = true; obj.x; // 1, o = true
변수 obj 를 정의 합 니 다. 값 은 object 이 고 obj. x 속성의 값 은 100 입 니 다.그 다음 에 다른 변수 o 를 정의 합 니 다. 값 은 여전히 이 object 대상 입 니 다. 이때 obj 와 o 두 변수의 값 은 같은 대상 을 가리 키 고 있 습 니 다 (같은 대상 의 참조 공유).그래서 대상 의 내용 을 수정 하 는 것 은 obj 와 o 에 영향 을 미친다.그러나 대상 은 인용 에 따라 전달 되 는 것 이 아니 라 o = true 를 통 해 o 의 값 을 수정 하여 obj 에 영향 을 주지 않 습 니 다.
용어 의 다른 버 전
주의해 야 할 것 은 값 을 구 하 는 정책 중의 '인용' 과 값 을 구 하 는 정책 자체 가 추상 적 인 개념 입 니 다. 여기 서 의 인용 과 언어의 구체 적 인 인용 (예 를 들 어 C + + 의 & a, C \ # 의 ref 매개 변수) 은 다 를 수 있 으 니 혼동 하지 마 십시오.
JS 가 전달 대상 유형의 값 을 전달 할 때 값 에 따라 인용 한 사본 이기 때문에 Dmitry 의 블 로그 (링크) 를 참고 하여 현재 JS 의 값 구 하 는 전략 에 대해 두 가지 해석 이 있 습 니 다.
JS 의 가치 추구 전략 에 대해 많은 논쟁 과 버 전이 있 지만 블 로 거들 의 비교 경향 에 대한 결론 은 다음 과 같다.
이 어 "JS 의 기본 유형 은 값 에 따라 전달 되 며 대상 유형 은 공유 에 따라 전달 된다" 고 덧 붙 였 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.