"JavaScript 함수 매개변수가 값(byVal)으로 전달되는지, 주소(byRef)로 전달되는지"에 대한 질문에 대해 흔히 오해하는 부분이 있습니다. 숫자, 문자열과 같은 "간단한 유형"은 값, 숫자, 문자열로 전달됩니다. , Object, Array 등 "복합 유형"은 전달 주소입니다.
이거 잘못된 것 아닌가요? 왜 그런 오해가 있습니까? 다음 두 코드를 살펴보세요.
//값이 가상 코드를 전달하는 원인
function 수정LikeByVal(x){
x = 1;
console.log('x = %d', x);
}
var x = 0;
console.log('x = %d', x); // 출력 x = 0
modifyLikeByVal(x); // 출력 x = 1
console.log('x = %d', x ); // 출력 x = 0 x는 변경되지 않았습니다!
//원인 잘못된 주소 전송
function의 코드 수정LikeByRef(x){
x[0] = 4;
x[1] = 5;
x[2] = 6;
콘솔 .log('x = [ %s ]', x.join(', '));
}
var x = [1, 2, 3];
console.log('x = [ %s ]' , x.join(', ')); // 출력 x = [ 1, 2, 3 ]
modifyLikeByRef(x); // 출력 x = [ 4, 5, 6 ]
console.log( 'x = [ %s ]', x.join(', ')); // 출력 x = [ 4, 5, 6 ] x가 변경되었습니다!
그러므로 위의 코드에서 "단순형"은 값(byVal)으로 매개변수로 전달되고, "복합형"은 주소(byRef)로 매개변수로 전달된다는 결론을 내릴 수 있습니다. .
무엇이 문제인가요?
두 함수를 주의 깊게 관찰하면 한 가지를 찾을 수 있습니다.
byVal에서 매개변수 x가 직접 수정됩니다: x = 1;
그리고 byRef에서는 매개변수 x의 멤버가 수정됩니다. x[0] = 4; x[1] = 5; x[2] = 6;
제 생각에는 JavaScript에서는 모든 변수나 멤버가 포인터인 것 같습니다. 변수나 멤버의 값을 수정하면 포인터의 주소가 실제로 수정됩니다.
위 코드는 이렇게 설명할 수 있습니다.
"byVal"에서:
global { / /는 전역 범위를 나타내며, 다음은 함수 범위를 나타냅니다.
var x = 0; // 포인터 x를 초기화하고 숫자 0을 가리킵니다
fun(x) {
x = global. x; // 매개변수 전달 global.x; fun 필드의 x 포인터 주소는 숫자 0을 가리킵니다
x = 1; // fun 필드의 x 포인터 주소는 숫자 1을 가리키도록 수정합니다. 🎜> } // fun 도메인이 종료되고 전역 도메인의 x 포인터가 변경되지 않았습니다.
}
In "byRef":
global { // 전역 범위를 나타내고, 다음은 함수 범위를 나타냅니다.
/*
포인터 x를 초기화하고 배열 [1, 2, 3]을 가리킵니다.
는 실제로 x, 0, 1, 2의 세 멤버로 각각 1, 2, 3을 가리킵니다.
*/
var x = [1, 2, 3];
fun(x) {
x = global.x; // fun 필드의 x 포인터 주소를 전달합니다. 배열 [1, 2, 3]
/ + = 4;
x[1] = 5;
x[2] = 6;
} // 재미있는 필드가 끝나고 x 전역 필드의 포인터는 변경되지 않았지만 세 개의 멤버 포인터가 변경되었으므로 출력 결과를 볼 수 있습니다
}
그렇다면 이 코드를 어떻게 설명할까요? ? ?
코드 복사
console.log(arguments, a, b);
})(-1, -2);
only a, b...라고 말할 수 있으며 이는 인수[0],...[n]의 별칭입니다.
잘못된 부분이 있으면 지적해주시면 감사하겠습니다.
더 좋은 설명이 있으면 공유해주세요.