참조 및 값별 자바 스크립트
이 질문에는 이미 답변이 있습니다.
- JavaScript는 참조 기준 또는 값 기준 언어입니까? 답변 29 개
Javascript가 값과 참조로 무언가를 전달할 때와 전달 된 항목을 수정하는 것이 함수 외부의 값에 영향을 미치지 않을 때에 대한 포괄적 인 좋은 읽기 자료를 찾고 있습니다. 또한 다른 변수에 할당 할 때 참조 대 값과 값 및 함수 매개 변수로 전달하는 것과 다른 규칙을 따르는 지 여부에 관심이 있습니다.
나는 많은 수색을하고 실제 규칙을 조각하기 시작할 수있는 구체적인 예제 (많은 것들이 여기에 있음)를 많이 찾았지만 아직 잘 작성된 단일 문서를 찾지 못했습니다. 모든 것을 설명합니다.
또한 언어로 무언가가 참조로 전달되는지 또는 값으로 전달되는지를 제어하는 방법이 있습니까?
다음은 제가 이해하고 싶은 몇 가지 유형의 질문입니다. 이것들은 단지 예일뿐입니다. 저는 실제로 특정 예에 대한 대답뿐만 아니라 언어가 따르는 규칙을 이해하려고합니다. 그러나 다음은 몇 가지 예입니다.
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"
자바 스크립트는 항상 가치를 전달합니다. 그러나 객체에 함수를 전달하면 "값"은 실제로 해당 객체에 대한 참조이므로 함수는 해당 객체의 속성을 수정할 수 있지만 함수 외부의 변수가 다른 객체를 가리 키도록 할 수는 없습니다 .
예를 들면 :
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는 항상 값으로 전달되지만 배열 또는 객체에서 값은 이에 대한 참조이므로 내용을 '변경'할 수 있습니다.
그러나 나는 당신이 이미 그렇게 읽은 것 같습니다. 여기에 원하는 문서가 있습니다.
http://snook.ca/archives/javascript/javascript_pass
- 문자열, 숫자와 같은 기본 유형 변수는 항상 값으로 전달됩니다.
이 두 가지 조건에 따라 배열과 객체는 참조로 전달되거나 값으로 전달됩니다.
새로운 Object 또는 Array를 사용하여 해당 Object 또는 Array의 값을 변경하면 Value를 전달합니다.
object1 = {item: "car"}; array1=[1,2,3];
여기에서 새 객체 또는 배열을 이전 객체에 할당합니다. 오래된 객체의 속성 값을 변경하지 않으므로 값으로 전달됩니다.
객체 또는 배열의 속성 값을 변경하는 경우 참조를 통해 전달됩니다.
object1.item= "car"; array1[0]=9;
여기서는 오래된 객체의 속성 값을 변경합니다. 이전 객체에 새 객체 또는 배열을 할당하지 않으므로 참조로 전달됩니다.
암호
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' 카테고리의 다른 글
Google은 어떤 데이터베이스를 사용합니까? (0) | 2020.02.28 |
---|---|
Java의 메소드 매개 변수에 키워드 "final"을 사용해야하는 이유는 무엇입니까? (0) | 2020.02.28 |
Android의 PreferenceActivity에서 SharedPreference를 가져 오려면 어떻게합니까? (0) | 2020.02.28 |
NSOrderedSet 생성 접근 자에서 예외가 발생했습니다. (0) | 2020.02.28 |
Gulp에 플래그를 전달하여 다른 방식으로 작업을 실행할 수 있습니까? (0) | 2020.02.28 |