오늘 문제 은행을 풀며 그래도 고민하다가 다 풀렸었는데 이 놈의 깊은 복사가 제 발목을 잡았습니다....
* 중첩 객체와 배열을 복사하는 깊은 복사 함수를 작성하세요.
* 재귀를 통해 객체나 배열을 만나면 내부까지 복사해야 합니다.
일단 전에 배웠던대로 코드를 먼저 작성해봤습니다.
function deepClone(obj) {
let result = {};
if(typeof obj === 'object' && obj !== null){
for(let prop in obj){
result[prop] = deepClone(obj[prop]);
}
}else{
result = obj;
}
return result;
}
일단 객체인지 확인을 하고....

이 말도 안되는 오류를 걸러내줍니다.
그런데 여기서 만약 배열이면 let result = []; 로 선언하고 if문에 배열인지 확인하는 코드가 있어야 하지 않나...? 라는 생각이 들었습니다.
그런데 여기서 또 충격적인게 객체도 'object'고 배열도 'object'라는 사실....

그럼 배열은 뭘 통해 검사할 수 있느냐... 바로 Array.isArray() 메서드입니다
Array.isArray() - JavaScript | MDN
Array.isArray() 정적 메서드는 전달된 값이 Array인지 판단합니다.
developer.mozilla.org
배열이면 true 아니면 false를 반환합니다.
function deepClone(obj) {
if(typeof obj === 'object' && obj !== null){
let result = Array.isArray(obj) ? [] : {};
for(let prop in obj){
result[prop] = deepClone(obj[prop]);
}
}else{
result = obj;
}
return result;
}
위에 객체로 한정 지어났던 result를 배열인지 아닌지를 통해서 각각 배열과 객체로 선언해주는 코드로 변경합니다.
그 이후로는 for(let prop in obj)를 통해 배열이면 인덱스값 객체면 키값에 접근하여 새로운 객체 혹은 배열을 복사할 수 있다...!입니다.
근데 저 위에 코드로 해도 잘 돌아가길래 튜터님께 질문했더니 테스트코드를 휙휙 보시더니 배열인지 객체인지 확인하는 코드는 없다고 하셨습니다....
어쨋든 통과...!

그래도 재귀를 통해 객체와 배열을 깊은 복사하는 방법을 다시 한 번 확인할 수 있어서 좋은 기회였습니다!