JavaScript에서 값 구문 정책 자세히 보기

최근에 람다 연산을 연구하고 있어요.η-자바스크립트에서 응용을 바꾸다가 우연히 stackoverflow에서 재미있는 문제를 봤어요.JavaScript의 값 구하기 전략에 대해 js에서 함수의 매개 변수 전달은 값에 따라 전달합니까 아니면 인용에 따라 전달합니까?대답은 고전적이다.

밤새 감추다


function changeStuff(a, b, c) {
  a = a * 10;
  b.item = "changed";
  c = {item: "changed"};
}

var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};

changeStuff(num, obj1, obj2);

console.log(num);         // 10
console.log(obj1.item);   // changed
console.log(obj2.item);   // unchanged
만약 js에서 함수의 매개 변수 전달이 값에 따라 전달된다면, 함수 changeStuff 내부에서 b.item의 값을 바꾸면 외부의obj1 대상의 값에 영향을 주지 않습니다.
만약 JS에서 함수의 매개 변수 전달이 도입에 따라 전달된다면 함수 changeStuff 내부의 변화는 함수 외부의 모든 변수 정의에 영향을 미치고num는 100,obj2가 된다.item은changed가 됩니다.실제로는 그렇지 않은 것이 분명하다.
따라서 JS에서 함수의 매개 변수 전달이 엄격하게 값에 따라 전달되거나 도입에 따라 전달된다고 할 수 없다.전반적으로 말하면 함수의 매개 변수는 모두 값에 따라 전달된다.JS에서는 공유 전송에 따른 매개 변수 전달 정책도 사용합니다.매개변수 유형에 따라 달라집니다.
만약 매개 변수가 기본 유형이라면 값에 따라 전달된다.
매개 변수가 인용 형식이라면 공유에 따라 전달됩니다.

매개 변수 전달


ECMAScript의 모든 함수의 매개변수는 값에 따라 전달됩니다.즉, 함수 외부의 값을 함수 내부의 매개 변수에 복제하는 것은 값을 한 변수에서 다른 변수로 복제하는 것과 같다.기본 유형 값의 전달은 기본 유형 변수의 복제와 같고, 참조 유형 값의 전달은 참조 유형 변수의 복제와 같습니다. --JavaScript 고급 프로그래밍
홍보서에서 모든 함수의 매개 변수는 값에 따라 전달된다고 하는데, 도대체 그렇지 않습니까?위에 있는 밤을 분석해 봅시다.

값에 따라 전달하다


JavaScript의 기본 유형이 매개 변수인 정책은 값에 따라 전달됩니다(call by value):

function foo(a) {
  a = a * 10;
}

var num = 10;

foo(num);

console.log(num); // 10  
함수 내부 파라미터의 변화가 외부 변수에 영향을 미치지 않는 것을 볼 수 있습니다.값에 따라 전달하는 것이 틀림없다.

공유 기반 전달


JavaScript에서 객체가 매개 변수로 전달되는 정책은 공유 전송(call by sharing)입니다.
매개변수의 속성을 수정하면 외부 객체에 영향을 미칩니다.
재할당 값은 외부 객체에 영향을 주지 않습니다.
위의 밤 함수 내부에 따라 매개 변수 b의 속성 item을 수정하면 함수 외부 대상에 영향을 줄 수 있기 때문에obj1의 속성 item도 변했다.

function bar(b) {
  b.item = "changed";
  console.log(b === obj1) // true
}

var obj1 = {item: "unchanged"};

bar(obj1);

console.log(obj1.item);   // changed  
b===obj1 인쇄 결과true에서 알 수 있듯이 함수 내부에서 파라미터의 속성을 수정했지만 파라미터의 인용에 영향을 주지 않았습니다.b와obj1은 대상 주소를 공유하기 때문에 매개 변수의 속성을 수정하면 외부 대상에 영향을 줍니다.
매개 변수 c를 새 대상에 다시 지정하면 외부 대상에 영향을 주지 않습니다.

function baz(c) {
  c = {item: "changed"};
  console.log(c === obj2) // false
}

var obj2 = {item: "unchanged"};

baz(obj2);

console.log(obj2.item);   // unchanged  
매개 변수 c를 새로운 대상에 다시 부여하면 c는 새로운 대상 주소에 귀속됩니다. c===obj2 인쇄 결과는false로 같은 대상 주소를 공유하지 않는다고 판단합니다.그것들은 각각 독립된 대상 주소를 가지고 있다.따라서 재부여 값은 외부 대상에 영향을 주지 않습니다.

총결산


공유에 따라 전달하는 것은 값에 따라 전달하는 특례라고 할 수 있으며, 전달하는 것은 인용 주소의 복사본이라고 할 수 있다.그래서 홍보서에서 말한 것도 맞아요.
ECMAScript 함수의 매개변수를 로컬 변수로 상상할 수 있습니다. --JavaScript 고급 프로그래밍

확장 - 불활성 값 구하기


앞에서 모든 함수의 매개 변수가 값에 따라 전달된다는 것을 알았다.JavaScript의 매개변수는 먼저 값을 구하고 실참 함수로 전달해야 합니다.하지만 ES6에는 예외가 있습니다.
매개 변수 기본값은 전달된 값이 아니라 매번 기본값 표현식의 값을 다시 계산합니다.즉, 매개변수 기본값은 불활성 값입니다. --ECMAScript 6 시작

let x = 99;
function foo(p = x + 1) {
  console.log(p);
}

foo() // 100

x = 100;
foo() // 101
위 코드에서 매개 변수 p의 기본값은 x+1입니다.이 때, 매번 함수 foo를 호출할 때마다 x+1을 다시 계산합니다. 기본 p는 100이 아닙니다.
다음은 자바스크립트의 값 구하기 정책에 대한 상세한 내용입니다. 자바스크립트 값 구하기 정책에 대한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!

좋은 웹페이지 즐겨찾기