JavaScript는 참조로 전달됩니까?
JavaScript는 참조를 통과합니까, 아니면 값을 통과합니까?
다음은 JavaScript의 예입니다. 좋은 부분들나는 매우 혼란스럽다.my
이치노은 사실 실래그 입니다.undefined
및 함수 내에서 재정의되었습니다.원본 참조는 없습니다.내부 영역
마감인가요?그러나 함수는 반환되지 않습니다.
var shape = function (config) {
var that = {};
that.name = config.name || "";
that.area = function () {
return 0;
};
return that;
};
var rectangle = function (config, my) {
my = my || {};
my.l = config.length || 1;
my.w = config.width || 1;
var that = shape(config);
that.area = function () {
return my.l * my.w;
};
return that;
};
myShape = shape({
name: "Unhnown"
});
myRec = rectangle({
name: "Rectangle",
length: 4,
width: 6
});
console.log(myShape.name + " area is " + myShape.area() + " " + myRec.name + " area is " + myRec.area());
원시 요소는 값으로 전달되고 개체는 "참조 복사본"으로 전달됩니다.
구체적으로는 오브젝트(또는 어레이)를 전달하면 (보이지 않게) 해당 오브젝트에 참조를 전달하고 그 오브젝트의 내용을 변경할 수 있지만 참조를 덮어쓰려고 해도 발신자가 보유하고 있는 참조의 복사본에는 영향을 주지 않습니다.즉, 참조 자체가 값에 의해 전달됩니다.
function replace(ref) {
ref = {}; // this code does _not_ affect the object passed
}
function update(ref) {
ref.key = 'newvalue'; // this code _does_ affect the _contents_ of the object
}
var a = { key: 'value' };
replace(a); // a still has its original value - it's unmodfied
update(a); // the _contents_ of 'a' are changed
이렇게 생각해 보세요.
ECMAscript에서 객체를 만들 때마다 이 객체는 누구도 얻을 수 없는 신비로운 ECMAscript 유니버설 공간에 형성됩니다.이 신비로운 장소에 있는 물건에 대한 언급만 하면 되니까요.
var obj = { };
지어도.obj
는 오브젝트(특별한 아름다운 장소에 있는 것)에 대한 참조일 뿐이므로, 이 참조를 전달할 수 있는 것은,실제로 obj에 액세스하는 모든 코드 조각은 멀리 있는 개체를 수정합니다.
내 의견으로는...JavaScript가 파라미터를 참조로 전달하든 값으로 전달하든 상관없습니다.정말 중요한 것은 할당 대 돌연변이이다.
(등호)를 와 마찬가지로 자바스크립트(JavaScript)를 사용합니다.=
를 참조해 주세요.
함수 내에서 이 파라미터의 동작은 등호를 사용하여 새 변수를 할당한 경우와 동일합니다.이 간단한 예를 들어보겠습니다.
var myString = 'Test string 1';
// Assignment - A link to the same place as myString
var sameString = myString;
// If I change sameString, it will not modify myString,
// it just re-assigns it to a whole new string
sameString = 'New string';
console.log(myString); // Logs 'Test string 1';
console.log(sameString); // Logs 'New string';
myString
함수에 대한 매개 변수로서, 이 매개 변수를 새 변수에 할당한 것처럼 작동합니다.으로 해 요?단순한 할당 대신 함수로
function myFunc(sameString) {
// Reassignment... Again, it will not modify myString
sameString = 'New string';
}
var myString = 'Test string 1';
// This behaves the same as if we said sameString = myString
myFunc(myString);
console.log(myString); // Again, logs 'Test string 1';
함수에 개체를 전달할 때 개체를 수정할 수 있는 유일한 이유는 재할당하지 않기 때문입니다.대신 개체를 변경하거나 변환할 수 있습니다.다시 말하지만, 같은 방식으로 작동합니다.
var myObject = { name: 'Joe'; }
// Assignment - We simply link to the same object
var sameObject = myObject;
// This time, we can mutate it. So a change to myObject affects sameObject and visa versa
myObject.name = 'Jack';
console.log(sameObject.name); // Logs 'Jack'
sameObject.name = 'Jill';
console.log(myObject.name); // Logs 'Jill'
// If we re-assign it, the link is lost
sameObject = { name: 'Howard' };
console.log(myObject.name); // Logs 'Jill'
myObject
함수에 대한 매개 변수로서, 이 매개 변수를 새 변수에 할당한 것처럼 작동합니다.똑같은 동작이지만 기능은 똑같아요
function myFunc(sameObject) {
// We mutate the object, so the myObject gets the change too... just like before.
sameObject.name = 'Jill';
// But, if we re-assign it, the link is lost
sameObject = {
name: 'Howard'
};
}
var myObject = {
name: 'Joe'
};
// This behaves the same as if we said sameObject = myObject;
myFunc(myObject);
console.log(myObject.name); // Logs 'Jill'
마다 같은 이든 간에 ".=
(등호)는 반드시 '등호'라는 .=
할당을 의미합니다.그리고 함수에 매개 변수를 전달한다는 것은 할당을 의미하기도 합니다.두 변수는 동일하고 두 변수는 정확히 동일한 방식으로 연결됩니다.
변수를 수정하는 것이 다른 변수에 영향을 미치는 유일한 시간은 기본 개체가 변환된 경우입니다.
개체와 원소를 구분하는 것은 의미가 없습니다. 함수가 없고 등호를 사용하여 새 변수를 할당하는 것과 동일한 방식으로 작동하기 때문입니다.
함수 인수는 값별 또는 공유별로 전달되지만 JavaScript에서는 참조로 전달되지 않습니다.
값별 콜
기본 유형은 값으로 전달됩니다.
var num = 123, str = "foo";
function f(num, str) {
num += 1;
str += "bar";
console.log("inside of f:", num, str);
}
f(num, str);
console.log("outside of f:", num, str);
기능 범위 내의 재할당은 주변 스코프에 표시되지 않습니다.
이것은, 에도 적용됩니다.String
복합 인 경우: s: 데데데데데데 s s s s s s 。
var str = "foo";
function f(str) {
str[0] = "b"; // doesn't work, because strings are immutable
console.log("inside of f:", str);
}
f(str);
console.log("outside of f:", str);
공유에 의한 콜
오브젝트, 즉 프리미티브가 아닌 모든 타입은 공유에 의해 전달됩니다.객체에 대한 참조를 보유하는 변수는 실제로 이 참조의 복사본만 보유합니다.JavaScript가 Call-by-Reference 평가 전략을 추구할 경우 변수는 원래 참조를 보유합니다.이것이 공유별과 참조별의 중요한 차이입니다.
이 구별의 실질적인 결과는 무엇입니까?
var o = {x: "foo"}, p = {y: 123};
function f(o, p) {
o.x = "bar"; // Mutation
p = {x: 456}; // Reassignment
console.log("o inside of f:", o);
console.log("p inside of f:", p);
}
f(o, p);
console.log("o outside of f:", o);
console.log("p outside of f:", p);
변환이란 기존의 특정 속성을 수정하는 것을 의미합니다.Object
이 를 참조하는 변수가 바인딩된 참조 복사본과 이 개체를 참조하는 참조 복사본은 동일하게 유지됩니다.따라서, 돌연변이는 발신자의 스코프에서 볼 수 있습니다.
재할당이란 변수에 바인딩된 참조 복사본을 대체하는 것을 의미합니다.복사본일 뿐이므로 동일한 참조의 복사본을 유지하는 다른 변수는 영향을 받지 않습니다.따라서, 재할당은, 참조에 의한 통화 평가 전략과 같이, 발신자의 범위에서는 볼 수 없습니다.
ECMAScript의 평가 전략에 대한 상세 정보.
C와 마찬가지로 궁극적으로 모든 것이 가치로 전달됩니다.C와 달리 변수에는 포인터가 없고 참조만 있기 때문에 실제로 백업 및 전달이 불가능합니다.
그리고 그 참조는 모두 객체에 대한 것이지 변수가 아닙니다.같은 결과를 얻기 위해서는 몇 가지 방법이 있습니다만, 콜 사이트나 선언 사이트의 어느 쪽인가에 키워드를 추가하는 것 뿐만이 아니라, 수작업으로 실시할 필요가 있습니다.
JavaScript는 pass by value입니다.
프리미티브의 경우 프리미티브 값이 전달됩니다.객체의 경우 객체의 참조 "값"이 전달됩니다.
오브젝트를 사용한 예:
var f1 = function(inputObject){
inputObject.a = 2;
}
var f2 = function(){
var inputObject = {"a": 1};
f1(inputObject);
console.log(inputObject.a);
}
f2를 호출하면 참조가 전달되고 참조의 "a" 값이 업데이트되므로 "a" 값이 1이 아닌 2로 출력됩니다.
프리미티브의 예:
var f1 = function(a){
a = 2;
}
var f2 = function(){
var a = 1;
f1(a);
console.log(a);
}
f2를 호출하면 "a" 값이 1로 출력됩니다.
const를 사용하는 간단한 예를 작성하기 위해...
const myRef = { foo: 'bar' };
const myVal = true;
function passes(r, v) {
r.foo = 'baz';
v = false;
}
passes(myRef, myVal);
console.log(myRef, myVal); // Object {foo: "baz"} true
실용적으로는 알니탁이 옳고 이해하기 쉽지만 자바스크립트에서는 모든 것이 가치로 전달된다.
객체의 "가치"는 무엇입니까?오브젝트 참조입니다.
개체를 전달하면 이 값의 복사본이 생성됩니다(따라서 Alnitak이 설명한 '참조 복사본').이 값을 변경할 경우 원래 개체는 변경되지 않고 해당 참조의 복사본이 변경됩니다.
"글로벌" JavaScript 변수는 창 개체의 구성원입니다.참조는 창 개체의 구성원으로 액세스할 수 있습니다.
var v = "initialized";
function byref(ref) {
window[ref] = "changed by ref";
}
byref((function(){for(r in window){if(window[r]===v){return(r);}}})());
// It could also be called like... byref('v');
console.log(v); // outputs changed by ref
위의 예는 함수 내에서 선언된 변수에는 적용되지 않습니다.
순수함이 없다면 자바스크립트에서 스칼라 인수를 참조로 에뮬레이트하는 가장 좋은 방법은 이전 답변과 같이 오브젝트를 사용하는 것이라고 생각합니다.
다만, 조금 다른 점이 있습니다.
함수 호출 내에서 객체 할당을 했기 때문에 함수 호출 근처에서 참조 파라미터를 볼 수 있습니다.소스의 가독성이 향상됩니다.
함수 선언에 코멘트 같은 속성을 넣었습니다.같은 이유로, 가독성이 있습니다.
var r;
funcWithRefScalars(r = {amount:200, message:null} );
console.log(r.amount + " - " + r.message);
function funcWithRefScalars(o) { // o(amount, message)
o.amount *= 1.2;
o.message = "20% increase";
}
위의 예에서는null
출력 기준 파라미터를 명확하게 나타냅니다.
출구:
240 - 20% Increase
클라이언트 측에서는console.log
로 대체해야 한다alert
.
★ ★ ★
보다 읽기 쉬운 또 다른 방법:
var amount, message;
funcWithRefScalars(amount = [200], message = [null] );
console.log(amount[0] + " - " + message[0]);
function funcWithRefScalars(amount, message) { // o(amount, message)
amount[0] *= 1.2;
message[0] = "20% increase";
}
여기에서는 새로운 더미 이름을 만들 필요도 없습니다.r
위에.
나는 사람들이 그런 것을 보여주려고 하는 예에서 일일이 언급하는 것을 볼 수 없다.나는 단지 가치만 본다.
객체에 대한 참조를 유지하는 변수의 경우 참조는 변수 값이며, 따라서 참조가 전달되고 그 값은 값별로 전달됩니다.
이런 성명에서
var a = {
b: "foo",
c: "bar"
};
'a'의 값은 객체가 아니라 객체에 대한 참조입니다.즉, 오브젝트는 변수 내에 없습니다.a
-그것을참조하다.JavaScript에만 익숙한 프로그래머에게는 어려운 일이라고 생각합니다.Java, C#, C#, C#, C는 Java, C#, C#, C#, C는 Java, C#, C는 C#, C#, C는 C#, C#, C는 C#, C는 Java, C#, C는 C#, C#, C#,
오브젝트는 항상 참조에 의해 전달되고 프리미티브는 값에 의해 전달됩니다.이 파라미터는 오브젝트에 대해 동일한 주소로 유지합니다.
여기 내 뜻을 설명하는 코드가 있습니다(https://js.do/) 등의 JavaScript 샌드박스에서 사용해 보십시오).
유감스럽게도 파라미터의 주소만 유지할 수 없습니다.원래 멤버 값도 모두 유지할 수 있습니다.
a = { key: 'bevmo' };
testRetain(a);
document.write(' after function ');
document.write(a.key);
function testRetain (b)
{
document.write(' arg0 is ');
document.write(arguments[0].key);
b.key = 'passed by reference';
var retain = b; // Retaining the original address of the parameter
// Address of left set to address of right, changes address of parameter
b = {key: 'vons'}; // Right is a new object with a new address
document.write(' arg0 is ');
document.write(arguments[0].key);
// Now retrieve the original address of the parameter for pass by reference
b = retain;
document.write(' arg0 is ');
document.write(arguments[0].key);
}
결과:
arg0 is bevmo arg0 is vons arg0 은 함수가 참조에 의해 전달된 후 참조에 의해 전달됩니다.
원시 요소는 값에 따라 전달됩니다.단, primitve의 값만 읽으면 되는 경우(또한 함수가 호출되었을 때 값을 알 수 없음), 필요한 순간에 값을 가져오는 함수를 전달할 수 있습니다.
function test(value) {
console.log('retrieve value');
console.log(value());
}
// call the function like this
var value = 1;
test(() => value);
언급URL : https://stackoverflow.com/questions/13104494/does-javascript-pass-by-reference
'programing' 카테고리의 다른 글
URL Connection이란 정확히 어떤 것입니까?setDoOutput()이 영향을 미칩니까? (0) | 2022.10.22 |
---|---|
pip이 패키지를 설치했지만 명령줄에서 실행 파일을 찾을 수 없습니다. (0) | 2022.10.22 |
const를 사용하는 경우 JSHint에서 경고가 발생하는 이유는 무엇입니까? (0) | 2022.10.22 |
정적 함수 내에서 $this를 사용하면 실패함 (0) | 2022.10.22 |
mariadb가 WSREP를 시작할 수 없음: std:: bad_alloc (0) | 2022.10.22 |