스택큐힙리스트

자바스크립트는 참조에 의한 전달(pass-by-reference) 또는 값에 의한 전달(pass-by-value) 언어입니까? 본문

카테고리 없음

자바스크립트는 참조에 의한 전달(pass-by-reference) 또는 값에 의한 전달(pass-by-value) 언어입니까?

스택큐힙리스트 2024. 1. 28. 19:09
반응형

기본 타입 (숫자, 문자열 등)은 값을 통해 전달되지만 객체는 알려지지 않았습니다. 객체는 값에 의해 전달될 수도 있으며 (이 경우에는 객체를 보유하는 변수가 사실상 객체에 대한 참조로 간주됨) 참조에 의해 전달될 수도 있습니다 (이 경우에는 변수가 객체 자체를 보유함으로 간주됨).


끝에서 정말 중요하지 않지만, 인자 전달 규칙을 올바르게 표시하는 방법을 알고 싶습니다. 이에 관한 자바스크립트 명세서에서 정의된 내용이 있을까요?

답변 1


  • 만약 obj1이 전혀 참조가 아니라면, obj1.item을 변경해도 함수 밖의 obj1에는 영향이 없을 것입니다.

  • 만약 인수가 적절한 참조였다면, 모든 것이 변경되었을 것입니다. num100이 되고, obj2.itemchanged로 읽혀졌을 것입니다. 대신에 num10으로 유지되고 obj2.itemunchanged 상태입니다.


대신, 전달된 항목은 값을 전달받습니다. 그러나 값으로 전달받은 항목은 자체적으로 참조입니다.
기술적으로, 이것은 call-by-sharing이라고 합니다.

실제로는, 이는 매개변수 자체 (numobj2와 같은)를 변경하면 그 매개변수에 전달된 항목에 영향을 주지 않는다는 것을 의미합니다. 그러나 매개변수의 내부를 변경하면 (예: obj1과 같은) 전파될 것입니다.

답변 2

자바스크립트는 pass-by-value를 따르는 언어입니다. 이는 변수를 전달할 때 변수의 값을 복사하여 전달하는 방식을 의미합니다.
pass-by-value 방식은 변수의 값을 복사하여 전달하기 때문에, 변수의 원래 값은 변경되지 않습니다. 따라서 함수 내에서 전달된 변수의 값을 변경하더라도, 원래 변수에는 영향을 주지 않습니다.
예를 들어, 다음과 같은 코드를 고려해봅시다:
```
function updateValue(value) {
value = 42; // 전달된 value의 값을 변경
}
var num = 10;
updateValue(num);
console.log(num); // 출력 결과: 10
```
이 코드에서 함수 `updateValue`는 전달된 `value` 변수의 값을 변경하려고 합니다. 하지만 결과를 보면, 원래 `num` 변수의 값은 여전히 10으로 유지되었습니다. 이는 pass-by-value 방식으로 인해 변수의 값이 함수 내부에서 변경되더라도, 원래 변수에는 영향을 주지 않기 때문입니다.
물론, 객체나 배열과 같은 참조 타입의 경우에는 pass-by-reference 처럼 동작할 수 있습니다. 이는 참조 타입의 데이터가 변수에 직접 저장되는 것이 아니라, 변수에는 객체나 배열의 주소 값이 저장되기 때문입니다. 하지만 여전히 pass-by-value 측면에서 접근하면 변수에는 값을 복사하여 전달하는 것이기 때문에, 원래 변수의 값을 변경하는 것은 불가능합니다.
따라서, 자바스크립트는 pass-by-value를 따르는 언어이며 변수의 값을 복사하여 전달하는 방식으로 동작합니다. 이는 변수의 원래 값을 보존하며, 예기치 않은 부작용을 방지하는 데에 도움을 줍니다.

반응형
Comments