developer tip

객체가 자바 스크립트 딥 카피 또는 얕은 카피의 배열로 푸시됩니까?

copycodes 2020. 11. 10. 08:18
반응형

객체가 자바 스크립트 딥 카피 또는 얕은 카피의 배열로 푸시됩니까?


꽤 자명 한 질문 ... 자바 스크립트의 배열에서 .push ()를 사용할 때 객체 가 유형에 관계없이 포인터 (얕은) 또는 실제 객체 (깊이)로 푸시됩니다 .


그것은 당신이 밀고있는 것에 달려 있습니다. 객체와 배열은 원래 객체에 대한 포인터로 푸시됩니다. 숫자 또는 부울과 같은 기본 제공 기본 유형은 사본으로 푸시됩니다. 따라서 객체는 어떤 방식으로도 복사되지 않기 때문에 깊거나 얕은 사본이 없습니다.

다음은이를 보여주는 작업 스 니펫입니다.

var array = [];
var x = 4;
let y = {name: "test", type: "data", data: "2-27-2009"};

// primitive value pushes a copy of the value 4
array.push(x);                // push value of 4
x = 5;                        // change x to 5
console.log(array[0]);        // array still contains 4 because it's a copy

// object reference pushes a reference
array.push(y);                // put object y reference into the array
y.name = "foo";               // change y.name property
console.log(array[1].name);   // logs changed value "foo" because it's a reference    

// object reference pushes a reference but object can still be referred to even though original variable is no longer within scope
if (true) {
    let z = {name: "test", type: "data", data: "2-28-2019"};
    array.push(z);
}

console.log(array[2].name);   // log shows value "test" since the pointer reference via the array is still within scope

jfriend00이 바로 여기에 있지만 한 가지 작은 설명이 있습니다. 그렇다고 변수가 가리키는 것을 변경할 수 없다는 의미는 아닙니다. 즉, y처음에는 배열에 넣은 일부 변수를 참조하지만 그런 다음라는 변수를 가져 와서 y지금 배열에있는 객체에서 연결을 끊고 객체를 변경하지 않고 완전히 다른 것을 연결할 수 있습니다 y(즉, 참조로 만들 수 있습니다 ). 이제 배열에 의해서만 참조됩니다 .

http://jsfiddle.net/rufwork/5cNQr/6/

var array = [];
var x = 4;
var y = {name: "test", type: "data", data: "2-27-2009"};

// 1.) pushes a copy
array.push(x);
x = 5;
document.write(array[0] + "<br>");    // alerts 4 because it's a copy

// 2.) pushes a reference
array.push(y);
y.name = "foo";

// 3.) Disconnects y and points it at a new object
y = {}; 
y.name = 'bar';
document.write(array[1].name + ' :: ' + y.name + "<br>");   
// alerts "foo :: bar" because y was a reference, but then 
// the reference was moved to a new object while the 
// reference in the array stayed the same (referencing the 
// original object)

// 4.) Uses y's original reference, stored in the array,
// to access the old object.
array[1].name = 'foobar';
document.write(array[1].name + "<br>");
// alerts "foobar" because you used the array to point to 
// the object that was initially in y.

참고 URL : https://stackoverflow.com/questions/8660901/do-objects-pushed-into-an-array-in-javascript-deep-or-shallow-copy

반응형