참조별 JavaScript 대 값별 JavaScript
JavaScript가 어떤 값을 전달했을 때, 언제 참조로 전달되었을 때, 그리고 전달된 항목을 수정했을 때 함수 외부의 값에 영향을 미쳤을 때와 그렇지 않을 때 좋은 종합 자료를 찾고 있습니다.또한 다른 변수에 할당하는 경우 참조 대 값에 의한 것인지, 함수 매개 변수로 전달하는 것보다 다른 규칙을 따르는지 여부도 관심이 있습니다.
실제 규칙을 정리할 수 있는 구체적인 예(여기 SO에 기재되어 있는 예)를 많이 검색해 보았습니다만, 이 모든 것을 설명하는 제대로 작성된 문서는 아직 발견되지 않았습니다.
또한, 언어에는 어떤 것이 참조에 의해 전달되는지 또는 가치로 전달되는지를 제어하는 방법이 있나요?
다음은 제가 이해하고 싶은 질문 유형입니다.이것들은 단지 예시일 뿐입니다.저는 실제로 특정 예에 대한 답뿐만 아니라 언어가 적용되는 규칙을 이해하려고 합니다.단, 예를 몇 가지 들 수 있습니다.
function f(a,b,c) {
a = 3;
b.push("foo");
c.first = false;
}
var x = 4;
var y = ["eeny", "miny", "mo"];
var z = {first: true};
f(x,y,z);
x, y, z의 내용이 f의 범위 밖에서 변경된 것은 언제입니까?
function f() {
var a = ["1", "2", "3"];
var b = a[1];
a[1] = "4";
// what is the value of b now for all possible data types that the array in "a" might hold?
}
function f() {
var a = [{yellow: "blue"}, {red: "cyan"}, {green: "magenta"}];
var b = a[1];
a[1].red = "tan";
// what is the value of b now and why?
b.red = "black";
// did the value of a[1].red change when I assigned to b.red?
}
오브젝트의 완전한 독립된 카피(참조 없음)를 작성하려면 어떻게 하는 것이 가장 좋을까요?
제가 아는 바로는 이것은 매우 단순합니다.
- Javascript는 항상 값으로 전달되지만 변수가 객체(배열 포함)를 참조할 경우 "값"은 객체에 대한 참조입니다.
- 변수의 값을 변경해도 기본 원시 또는 개체는 변경되지 않으며, 새로운 원시 또는 개체를 가리킬 뿐입니다.
- 그러나 변수가 참조하는 개체의 속성을 변경하면 기본 개체가 변경됩니다.
몇 가지 예를 들어 보겠습니다.
function f(a,b,c) {
// Argument a is re-assigned to a new value.
// The object or primitive referenced by the original a is unchanged.
a = 3;
// Calling b.push changes its properties - it adds
// a new property b[b.length] with the value "foo".
// So the object referenced by b has been changed.
b.push("foo");
// The "first" property of argument c has been changed.
// So the object referenced by c has been changed (unless c is a primitive)
c.first = false;
}
var x = 4;
var y = ["eeny", "miny", "mo"];
var z = {first: true};
f(x,y,z);
console.log(x, y, z.first); // 4, ["eeny", "miny", "mo", "foo"], false
예 2:
var a = ["1", "2", {foo:"bar"}];
var b = a[1]; // b is now "2";
var c = a[2]; // c now references {foo:"bar"}
a[1] = "4"; // a is now ["1", "4", {foo:"bar"}]; b still has the value
// it had at the time of assignment
a[2] = "5"; // a is now ["1", "4", "5"]; c still has the value
// it had at the time of assignment, i.e. a reference to
// the object {foo:"bar"}
console.log(b, c.foo); // "2" "bar"
Javascript는 항상 값으로 통과합니다.그러나 개체를 함수에 전달하면 "값"은 실제로 해당 개체에 대한 참조이므로 함수는 해당 개체의 속성을 수정할 수 있지만 함수 외부의 변수가 다른 개체를 가리키도록 할 수는 없습니다.
예:
function changeParam(x, y, z) {
x = 3;
y = "new string";
z["key2"] = "new";
z["key3"] = "newer";
z = {"new" : "object"};
}
var a = 1,
b = "something",
c = {"key1" : "whatever", "key2" : "original value"};
changeParam(a, b, c);
// at this point a is still 1
// b is still "something"
// c still points to the same object but its properties have been updated
// so it is now {"key1" : "whatever", "key2" : "new", "key3" : "newer"}
// c definitely doesn't point to the new object created as the last line
// of the function with z = ...
네, Javascript는 항상 값으로 전달되지만 배열이나 객체에서는 해당 값이 참조가 되므로 내용을 '변경'할 수 있습니다.
SO에 대해서는 이미 읽어보셨다고 생각합니다.필요한 문서가 여기 있습니다.
http://snook.ca/archives/javascript/javascript_pass
- string, number와 같은 원시 유형 변수는 항상 pass by value로 전달됩니다.
어레이와 오브젝트는 이 두 가지 조건에 따라 참조로 전달되거나 값으로 전달됩니다.
해당 개체 또는 배열의 값을 새 개체 또는 배열로 변경하는 경우 해당 개체 또는 배열은 값으로 전달됩니다.
object1 = {item: "car"}; array1=[1,2,3];
여기서 새 개체 또는 어레이를 이전 개체에 할당합니다.오래된 object.so의 속성 값을 변경하지 않습니다.그 값은 pass by value입니다.
개체 또는 배열의 속성 값을 변경할 경우 참조에 의해 전달됩니다.
object1.item= "car"; array1[0]=9;
여기서 이전 개체의 속성 값을 변경합니다.새로운 오브젝트 또는 어레이를 오래된 one.so에 할당하지 않고 참조로 전달합니다.
코드
function passVar(object1, object2, number1) {
object1.key1= "laptop";
object2 = {
key2: "computer"
};
number1 = number1 + 1;
}
var object1 = {
key1: "car"
};
var object2 = {
key2: "bike"
};
var number1 = 10;
passVar(object1, object2, number1);
console.log(object1.key1);
console.log(object2.key2);
console.log(number1);
Output: -
laptop
bike
10
언급URL : https://stackoverflow.com/questions/6605640/javascript-by-reference-vs-by-value
'programing' 카테고리의 다른 글
| C는 왜 싸인이 없는 수레가 없는 거죠? (0) | 2022.11.30 |
|---|---|
| 비 ASC와 일치하는 정규 표현II 캐릭터? (0) | 2022.11.30 |
| PHP. array_column을 객체 배열과 함께 사용할 수 있습니까? (0) | 2022.11.30 |
| MySQL/MariaDB: 'GRANT...'의 차이점은 무엇입니까?'사용자 생성'과 '허가'로 구분됩니까? (0) | 2022.11.30 |
| VueJ가 어레이 길이 변경에 응답하지 않습니까? (0) | 2022.11.30 |