Programing

참조 및 값별 자바 스크립트

lottogame 2020. 2. 28. 18:37
반응형

참조 및 값별 자바 스크립트


이 질문에는 이미 답변이 있습니다.

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


  1. 문자열, 숫자와 같은 기본 유형 변수는 항상 값으로 전달됩니다.
  2. 이 두 가지 조건에 따라 배열과 객체는 참조로 전달되거나 값으로 전달됩니다.

    • 새로운 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



반응형