const obj = {
mastermind: 'Joker',
henchwoman: 'Harley',
relations: ['Anarky', 'Duela Dent', 'Lucy'],
twins: {
'Jared Leto': 'Suicide Squad',
'Joaquin Phoenix': 'Joker',
'Heath Ledger': 'The Dark Knight',
'Jack Nicholson': 'Tim Burton Batman',
},
};
const copiedObj = Object.assign({}, obj);
delete obj.twins['Jared Leto'];
expect('Jared Leto' in copiedObj.twins).to.equal(??)
obj
로 선언된 객체를 Object.assign()
을 이용해 복사를 하고 원본인obj
의 참조 자료형 중 하나인 twins.Jared Leto
를 삭제 했을때 복사본인 copiedObj
에는 twins.Jared Leto
이 남아있는지 없는지에 관한 문제다.
복사가 어떤식으로 되는지에 관한 문제인데 Object.assign
을 포함한 slice()
, spread syntax
는 얕은 복사가 되는 특징을 가지고 있다.
얕은복사는 참조자료형을 복사하는 방법인데 사용시 유의해야될 사항으로는
참조 자료형 내부에 참조 자료형이 중첩되어 있는 경우, slice(), Object.assign(), spread syntax를 사용해도 참조 자료형 내부에 참조 자료형이 중첩된 구조는 복사할 수 없다.
중첩되어있는 참조 자료형의 경우에는 복사가 되더라도 중첩된자료에 한에서는 같은 주소값을 참조하기 때문에 복사본을 수정해도 원본이 수정되는 상황이 온다.
console.log(copiedObj.twins)
//{
'Joaquin Phoenix': 'Joker',
'Heath Ledger': 'The Dark Knight',
'Jack Nicholson': 'Tim Burton Batman'
}
function getAllParamsByRestParameter(...args) {
return args;
}
function getAllParamsByArgumentsObj() {
return arguments;
}
const restParams = getAllParamsByRestParameter('first', 'second', 'third');
const argumentsObj = getAllParamsByArgumentsObj('first', 'second', 'third');
expect(Array.isArray(restParams)).to.deep.equal(??);
expect(Array.isArray(argumentsObj)).to.deep.equal(??);
spread syntax
와 arguments
로 만든 값들이 배열인지 아닌지에 관한 문제다.
MDN에서의 arguments
를 보면
객체 형태로 return이 된다는 말이다.
console.log(Array.isArray(restParams)) // ture
console.log(Array.isArray(argumentsObj)) // false
console.log(typeof argumentsObj) // object
object
로 확인된다.