[JS] 딥 카피 실현
2415 단어 WEB 프론트 엔 드딥 카피
WEB 플랫폼 에 서 는 심 복 사 를 피 하려 고 애 써 JSON. parse (JSON. stringify (Object) 를 사용 해 심 복 사 를 피 해 왔 다.오늘 BUG 를 만 났 다 는 것 을 알 고 JSON 은 function 을 문자열 로 바 꾸 었 습 니 다. 이 BUG 에 줄 을 섰 을 때 초췌 했 습 니 다. Node. js 플랫폼 이 라면 기 존의 바퀴 가 고 르 기 를 기다 리 고 있 었 습 니 다. 안 타 깝 게 도 WEB 는 함부로 들 어 오지 못 하고 손 으로 < > 를 썼 습 니 다.
깊이 복사
/**
*
* :Boolean,Number,String,null,undefined,Array,Object
* @param {*} obj
*/
function deepClone(obj) {
if (isBaseDataType(obj)) {
return obj;
}
/**
*
* Symbol
* @param {*} obj
*/
function judgeType(_obj) {
return _obj === null ? 'null' : _obj instanceof Array ? 'array' : typeof _obj !== 'object' ? typeof _obj : 'object';
}
/**
*
* @param {*} obj
*/
function isBaseDataType(_obj) {
var types = ['boolean', 'number', 'string', 'function', 'null', 'undefined'];
var type = judgeType(_obj);
return types.indexOf(type) !== -1;
}
/**
*
* @param {*} _obj
* @param {*} res
*/
function _cloneArry(_obj) {
var res = [];
for (var i = 0, len = _obj.length; i < len; i++) {
var value = _obj[i];
if (isBaseDataType(value)) {
res.push(value);
} else if (judgeType(value) === 'object') {
res.push(_cloneObj(value));
} else if (judgeType(value) === 'array') {
res.push(_cloneArry(value));
}
}
return res;
}
/**
*
* @param {*} _obj
* @param {*} res
*/
function _cloneObj(_obj) {
var res = {};
for (var attr in _obj) {
var value = _obj[attr];
if (isBaseDataType(value)) {
res[attr] = value;
} else if (judgeType(value) === 'object') {
res[attr] = _cloneObj(value);
} else if (judgeType(value) === 'array') {
res[attr] = _cloneArry(value);
}
}
return res;
}
if (judgeType(obj) === 'array') {
return _cloneArry(obj);
} else {
return _cloneObj(obj);
}
}
또한 Object. assgin, 이 인 터 페 이 스 는 정말 깊 은 복사 가 아니 라 크 지도 작 지도 않 은 구덩이 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
자바의 복사 메커니즘을 깊이 이해하다만약 우리new가 새로운 대상을 낸다면, 하나의 성명으로 인용하고, 그 다음에 다른 성명으로 이전 성명을 인용한다면, 마지막 결과는 이 두 성명의 변수는 같은 대상을 가리키며, 한 곳은 모두 수정될 것이다.만약 우리...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.