JS 객체의 참조, 객체의 복사본
장면
기본 형식과null을 제외하고 대상 사이의 값은 주소를 같은 것으로 가리키는 것이지 진정한 의미의 복사가 아니다
한 대상을 다른 대상에게 값을 부여하다.
var a = [1,2,3];
var b = a;
b.push(4); // b 4
alert(a); // a [1,2,3,4]
사용자 정의 객체
var obj = {a:10};
var obj2 = obj;
obj2.a = 20; // obj2.a ,
alert(obj.a); // 20,obj a
이것은 대상 유형이 직접 값을 부여하기 때문에 인용을 같은 주소로 가리키기 때문에 obj를 수정하면 obj2도 수정될 수 있다
2. 얕은 복사
그래서 우리는 하나의 함수를 봉하여 대상을 복사하고 for in 순환을 통해 기본 유형을 얻으며 모든 기본 유형을 부여해야만 진정한 의미에서 대상을 복제할 수 있다
var obj = {a:10};
function copy(obj){
var newobj = {};
for ( var attr in obj) {
newobj[attr] = obj[attr];
}
return newobj;
}
var obj2 = copy(obj);
obj2.a = 20;
alert(obj.a); //10
이렇게 하면 대상의 가치 부여 문제를 해결할 수 있다.
3. 심층 복사
그러나 여기에 위험이 존재한다. 만약에 obj에서 a의 값이 10이 아니라 하나의 대상이라면 forin에서 a라는 대상의 인용 값을 새로운 대상으로 하고 대상의 인용 문제를 초래할 수 있다.
var obj = {a:{b:10}};
function copy(obj){
var newobj = {};
for ( var attr in obj) {
newobj[attr] = obj[attr];
}
return newobj;
}
var obj2 = copy(obj);
obj2.a.b = 20;
alert(obj.a.b); //20
따라서 이copy대상은 1층만 복사하기 때문에 심층의 대상을 복사할 수 없습니다. 이copy는 얕은 복사이기 때문에 우리는 귀속을 통해 심층의 대상을 복사해야 합니다.copy를 귀속으로 바꾸면 됩니다
var obj = {a:{b:10}};
function deepCopy(obj){
if(typeof obj != 'object'){
return obj;
}
var newobj = {};
for ( var attr in obj) {
newobj[attr] = deepCopy(obj[attr]);
}
return newobj;
}
var obj2 = deepCopy(obj);
obj2.a.b = 20;
alert(obj.a.b); //10
전재 대상:https://www.cnblogs.com/linhp/p/6085826.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.