js 함수 에서 전달 대상 파라미터

8771 단어 js
위의 문 제 를 알 고 있다.http://www.zhihu.com/question/27114726
javascript 전달 매개 변수 가 object 라면 값 에 따라 전달 합 니까? 인용 에 따라 전달 합 니까?
像js函数中传递对象参数_第1张图片
저작권 은 작가 에 게 있다.상업 전 재 는 작가 에 게 연락 하여 권한 을 수 여 받 으 십시오. 비 상업 전 재 는 출처 를 밝 혀 주 십시오.저자: 소 묵 귤 링크:http://www.zhihu.com/question/27114726/answer/35481766 알다
이전에 이 부분 을 처음 보 았 을 때 도 약간 어리둥절 했다. 오늘 은 문제 주가 이 문 제 를 묻 는 것 을 보고 다시 한 번 자세히 보고 관련 자 료 를 찾 아 보 았 는데 지금 은 비교적 명확 한 셈 이다.자신의 이해 와 결합 하여 정리 하 였 다.P. S. 위의 읽 기 체험 이 좋 지 않다 고 생각 되면 제 블 로 그 를 직접 방문 하 는 것 을 권장 합 니 다. 글씨체, 크기, 줄 간격 은 모두 정 성 스 럽 게 선택 한 것 입 니 다. 여기에 찍 습 니 다. - > Js 중간 값 의 방문 과 매개 변수 전달 문 제 는 이 문 제 를 철저히 말 해 야 하기 때문에 더욱 깊 은 지식 과 관련 되 기 때문에 지면 이 길 기 때문에 인내심 을 가지 고 보 세 요.사실 당신 은 조금 만 알 면 됩 니 다. 대상 의 변 수 를 저장 합 니 다. 그 안에 설 치 된 값 은 이 대상 이 메모리 에 있 는 주소 입 니 다.다음은 상세 분해: 데이터 형식
javascript 에서 데이터 형식 은 두 가지 로 나 눌 수 있 습 니 다.
  • 원본 데이터 형식 값 primitive type, 예 를 들 어 Undefined, Null, Boolean, Number, String.
  • 인용 유형 값, 즉 대상 유형 Object type, 예 를 들 어 Object, Array, Function, Date 등 이다.

  • 변 수 를 설명 할 때 다른 메모리 할당
  • 원시 값: 스 택 (stack) 에 저 장 된 간단 한 데이터 세그먼트, 즉 그들의 값 은 변수 가 접근 하 는 위치 에 직접 저 장 됩 니 다.이것 은 이러한 원시 형식 이 차지 하 는 공간 이 고정 되 어 있 기 때문에 그들 을 작은 메모리 영역 - 창고 에 저장 할 수 있 습 니 다.이렇게 저장 하면 변수의 값 을 신속하게 찾 을 수 있다.
  • 인용 값: 더미 (heap) 에 저 장 된 대상, 즉 변수 에 저 장 된 값 은 포인터 (point) 로 저장 대상 의 메모리 주 소 를 가리킨다.인용 값 의 크기 가 바 뀌 기 때문에 스 택 에 두 면 안 됩 니 다. 그렇지 않 으 면 변수 검색 속 도 를 낮 출 수 있 습 니 다.반면 변수의 스 택 공간 에 놓 인 값 은 이 대상 이 쌓 여 있 는 주소 입 니 다.주소 의 크기 는 고정 되 어 있 기 때문에 스 택 에 저장 하 는 것 은 변수 성능 에 부정적인 영향 을 주지 않 습 니 다.lt;img src="https://pic4.zhimg.com/55261f168f9369f6dfa53dbcd01aa1ff_b.jpg" data-rawwidth="667" data-rawheight="419" class="origin_image zh-lightbox-thumb" width="667" data-original="https://pic4.zhimg.com/55261f168f9369f6dfa53dbcd01aa1ff_r.jpg"> 像js函数中传递对象参数_第2张图片

  • 서로 다른 메모리 분배 메커니즘 도 서로 다른 접근 메커니즘 을 가 져 왔 다. javascript 에 서 는 메모리 에 저 장 된 대상 에 직접 접근 할 수 없 기 때문에 대상 을 방문 할 때 먼저 이 대상 이 메모리 에 있 는 주 소 를 얻 은 다음 에 이 주소 에 따라 이 대상 의 값 을 얻는다. 이것 이 바로 전설의 인용 접근 이다.원본 형식의 값 은 직접 접근 할 수 있 습 니 다.변 수 를 복사 할 때의 차이 점
  • 원시 값: 원시 값 이 저 장 된 변 수 를 다른 변수 에 복사 할 때 원시 값 의 복사 본 을 새로운 변수 에 할당 합 니 다. 그 후에 이 두 변 수 는 완전히 독립 되 었 습 니 다. 그들 은 똑 같은 value 만 가지 고 있 을 뿐 입 니 다. <img src="https://pic2.zhimg.com/6ff3fb467ec508d8dab223d25618d611_b.jpg" data-rawwidth="526" data-rawheight="336" class="origin_image zh-lightbox-thumb" width="526" data-original="https://pic2.zhimg.com/6ff3fb467ec508d8dab223d25618d611_r.jpg"> 像js函数中传递对象参数_第3张图片
  • 인용 값: 대상 의 메모리 주 소 를 저장 하고 있 는 변 수 를 다른 변수 에 복사 할 때 이 메모리 주 소 를 새로운 변수 에 할당 합 니 다. 즉, 이 두 변 수 는 모두 메모리 에 있 는 같은 대상 을 가리 키 고 있 습 니 다. 그들 중 하 나 는 변경 사항 이 다른 사람 에 게 반 영 됩 니 다.(여기 서 이해 해 야 할 것 은 대상 을 복사 할 때 메모리 에 똑 같은 대상 으로 새로 태 어 나 지 않 는 다 는 것 이다. 단지 이 대상 을 가리 키 는 지침 을 저장 하 는 변수 가 하나 더 생 겼 을 뿐이다) & lt;img src="https://pic2.zhimg.com/0890f4f6faa8eeaa7f25cd1d769ceef5_b.jpg" data-rawwidth="793" data-rawheight="359" class="origin_image zh-lightbox-thumb" width="793" data-original="https://pic2.zhimg.com/0890f4f6faa8eeaa7f25cd1d769ceef5_r.jpg"> 像js函数中传递对象参数_第4张图片

  • 매개 변수 전달 의 차이
    우선 우 리 는 ECMAScript 의 모든 함수 의 매개 변 수 는 값 에 따라 전달 된다 는 것 을 명확 하 게 해 야 한다.그러나 왜 원본 형식 과 인용 형식의 값 을 언급 할 때 여전히 차이 가 있 습 니까? 메모리 가 분 배 될 때의 차이 때 문 이 아 닙 니 다.(제 가 비교 해 봤 는데 여 기 는 변 수 를 복사 할 때 지 키 는 체제 와 똑 같 잖 아 요. 매개 변 수 를 전달 할 때 실제 인삼 을 형 삼 에 복사 하 는 과정 으로 간단하게 이해 할 수 있 습 니 다)
  • 원시 값: 변수 안의 값 을 매개 변수 에 전달 한 후에 매개 변수 와 이 변 수 는 서로 영향 을 주지 않 습 니 다.

  • 인용 값: 대상 변수 에 있 는 값 은 이 대상 이 메모리 에 있 는 메모리 주소 입 니 다. 이 점 을 항상 명심 하 세 요!따라서 전달 하 는 값 은 바로 이 메모리 주소 입 니 다. 이것 은 바로 함수 내부 에서 이 매개 변수 에 대한 수정 이 외부 에 나타 나 는 이유 입 니 다. 왜냐하면 그들 은 모두 같은 대상 을 가리 키 기 때 문 입 니 다.아마 내 가 이렇게 말 한 후에 너 는 책의 예 에 대해 좀 이해 하지 못 할 것 이다. 그러면 그림 을 보 세 요: & lt;img src="https://pic1.zhimg.com/33472bcc2789b7d071f119169b7d6e20_b.jpg" data-rawwidth="719" data-rawheight="419" class="origin_image zh-lightbox-thumb" width="719" data-original="https://pic1.zhimg.com/33472bcc2789b7d071f119169b7d6e20_r.jpg">
    像js函数中传递对象参数_第5张图片
    따라서 인용 에 따라 전달 된다 면 두 번 째 칸 의 내용 (즉 변수 자체) 을 모두 전달 하 는 것 이다 (네 번 째 칸 의 존재 가 없 을 것 이다).그러나 사실은 변수 가 그 안의 값 을 매개 변수 에 전달 하고 이 매개 변수 도 원래 대상 을 가리 키 게 하 는 것 이다.따라서 함수 내부 에서 이 매개 변수 에 다른 대상 을 할당 할 때 이 매개 변 수 는 새로운 대상 의 메모리 주 소 를 새로운 대상 으로 변경 합 니 다. 그러나 이때 원래 의 변 수 는 원래 의 대상 을 가리 키 고 이 때 그들 은 서로 독립 됩 니 다.그러나 이 매개 변수 가 대상 내부 의 속성 을 바 꾸 는 것 이 라면 이 변 화 는 외부 에 나타 날 것 입 니 다. 그들 이 공동으로 가리 키 는 이 대상 이 수정 되 었 기 때 문 입 니 다!다음 예 를 살 펴 보 자. (전설의 callby sharing)
    var obj1 = {
      value:'111'
    };
     
    var obj2 = {
      value:'222'
    };
     
    function changeStuff(obj){
      obj.value = '333';
      obj = obj2;
      return obj.value;
    }
     
     
    var foo = changeStuff(obj1);
     
    console.log(foo);// '222'   obj       obj2
    console.log(obj1.value);//'333'
    

    code 의 주석 이 너무 작 아서 잘 보이 지 않 습 니 다. 제 가 여기 로 옮 기 겠 습 니 다.
    /* obj1         ,   value   ,
     *   changeStuff       ,    obj   obj1  .
     *     ,          ,    obj1.value     '222' 
    */
    

    자, 이상 이 이 문제 에 관 한 모든 해석 입 니 다.
    여러분 관심 있 으 시 면 콜 by value, 콜 by reference callby sharing 등 함수 전달 메커니즘 콜 by sharing 에 대해 알 아 보 세 요.
    그리고 stackoverflow 에서 함수 전달 에 대한 이 문 제 는 상당히 치밀 하 게 해석 되 어 볼 만하 다.(아래 링크 가 있 음)
    참고:
  • ECMAScript 원시 값 과 인용 값
  • Is JavaScript a pass-by-reference or pass-by-value language?
  • 나의 홍 보 서 P69 - P71
  • 어디 가 모 르 거나 내 가 표현 이 명확 하지 않 고 정확 하지 않다 고 생각 하 는 곳 이 있 습 니까? 함께 토론 하 는 것 을 환영 합 니 다 ~vert; BOSN.ME

    좋은 웹페이지 즐겨찾기