js 에서 인용 전달 과 값 전달

5076 단어
값 에 따라 전달 VS. 인용 에 따라 전달
값 에 따라 전달 (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); 
}

여기 서 우 리 는 볼 수 있다.
  • a = > p 가 값 에 따라 전달 할 때 형 삼 p 의 값 을 수정 하 는 것 은 실제 인삼 a 에 영향 을 주지 않 고 p 는 a 의 사본 일 뿐이다.
  • b = > q 는 인용 에 따라 전달 되 고 형 삼 q 의 값 을 수정 할 때 도 실 삼 b 의 값 에 영향 을 미친다.

  • 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 의 가치 추구 전략 에 대해 많은 논쟁 과 버 전이 있 지만 블 로 거들 의 비교 경향 에 대한 결론 은 다음 과 같다.
    이 어 "JS 의 기본 유형 은 값 에 따라 전달 되 며 대상 유형 은 공유 에 따라 전달 된다" 고 덧 붙 였 다.

    좋은 웹페이지 즐겨찾기