JavaScript: 값에 의한 전달과 참조에 의한 전달
3749 단어 javascriptbeginners
참조로 인수를 전달하는 것과 값으로 인수를 전달하는 것의 가장 큰 차이점은 무엇입니까?
기본 값
JavaScript에서도 다른 많은 언어와 마찬가지로 어느 시점에서 이 개념을 접하게 될 것입니다. 호출 스택 및 힙으로 돌아가서 데이터가 저장되는 위치, Primitives (
Number
, String
, Boolean
, Undefined
, Null
, Symbol
, BigInt
)는 호출 스택에 저장됩니다. Objects ( Object Literal
, Arrays
, Functions
, more...), 힙에 저장됩니다.기본 값을 만들 때 JavaScript는 값 이름으로 고유 식별자를 만듭니다. 그런 다음 값과 함께 주소에 메모리를 할당합니다. 식별자는 주소를 가리키지만 값 자체는 가리키지 않습니다. 기본 값은 변경할 수 없습니다. 즉, 값을 재할당하거나 다른 곳에서 변경하더라도 값이 존재하는 다른 곳에서는 변경되지 않습니다.
let season = "Fall";
let nextSeason = season;
season = "Winter";
console.log(season);
console.log(nextSeason);
//// Returns
// Winter
// Fall
그래도
season
값이 Winter
로 재할당되었습니다. , 변경해도 nextSeason
처음에 Fall
로 설정되었습니다. . 변경되지 않은 상태로 유지됩니다.참조 값
새 객체를 생성하면 메모리 주소로 힙에 저장되고 값 자체로 저장됩니다. 변수를 객체로 선언할 때 변수에 대해 생성된 식별자는 스택의 메모리 부분을 가리키며, 이는 차례로 객체가 저장된 힙의 메모리 부분을 가리킵니다.
이 때문에 하나의 개체에 대해 여러 복사본이 생성될 때마다 메모리에 새 개체가 생성되지 않습니다. 원래 개체에 대해 동일한 식별자를 가리킬 뿐입니다. 따라서 한 개체를 변경하면 동일한 메모리 주소를 가리키는 모든 개체가 변경되는 효과가 있습니다.
const dog = {
name: "Beau",
age: 15
};
const puppy = dog;
puppy.age = "10 months";
console.log('Puppy:', puppy)
// Returns
// Puppy: {name: 'Beau', age: '10 months'}
console.log('Dog:', dog)
// Returns
// Dog: {name: 'Beau', age: '10 months'}
Primitives와 Objects의 차이점을 이해하는 것이 중요합니다. 그렇지 않으면 코드에 꽤 불쾌한 놀라움과 버그가 발생할 수 있기 때문입니다. 또한 함수로 이동할 때 참조에 의한 전달과 값에 의한 전달의 차이점을 이해할 수 있도록 합니다.
값으로 전달
함수로 이동하여 기본 값을 인수로 함수에 전달하면 함수가 함수 자체 외부에서 함수 컨텍스트 내부에서 해당 값을 조작하더라도 값이 그대로 유지됩니다.
전:
let x = 1;
function alter(arg) {
arg = 100;
return arg;
};
change(x)
// Returns 100
console.log(x)
// returns 1
참조로 전달
함수에 참조 유형을 전달할 때 복사되는 것은 메모리 힙에 대한 참조 객체입니다. 둘 다 메모리의 동일한 개체를 가리킵니다. 객체가 함수에서 조작될 때 두 참조가 동일한 객체를 가리키므로 객체 자체를 조작하는 것과 같습니다. 한 곳에서 변경하고 다른 모든 곳에서 개체가 변경되었습니다.
const dog = {
name: "Beau",
age: 15
};
const happyBirthday = function(arg){
arg.age = arg.age + 1;
}
happyBirthday(dog)
console.log(dog)
// Returns
dog {name: 'Beau', age: 16}
결론
요약하자면, 기본 유형이 함수에 전달되면 복사본이 생성됩니다. 객체를 함수에 전달할 때 객체 자체를 전달하는 것과 같습니다. 이는 다시 큰 문제로 이어질 수 있으므로 주의해야 합니다.
추가 읽기
value vs reference
academind
Reference
이 문제에 관하여(JavaScript: 값에 의한 전달과 참조에 의한 전달), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/dani8439/javascript-passing-by-value-vs-pass-by-reference-3pfc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)