자바스크립트의 값은 "원시값" 과 "참조값" 으로 나뉜다
원시값
- Number
- String
- Boolean
- Null
- Undefined
참조값
- Object
- Symbol
const a = {
one: 1,
two: 2,
};
let b = a;
b.one = 3;
console.log(a); // { one: 3, two: 2 } 출력
console.log(b); // { one: 3, two: 2 } 출력
// 기존 값에 영향을 끼친다.
=
를 사용해서 복사하면 얕은 복사 가 된다. 객체의 복사본을 수정하게 되면 원본도 함께 수정이된다. 객체는 값을 복사하는 것이 아니라, 참조를 하기 때문얕은 복사
- 객체를 복사할 때 기존 값과 복사된 값이 같은 참조를 가리키고 있는 것
- 객체 안에 객체가 있을 경우에 한 개의 객체라도 기존 변수의 객체를 참조하고 있다면 이를 얕은 복사라고 한다
slice()
? start 부터 end 인덱스까지 기존 배열에서 추출하여 새로운 배열을 리턴하는 메서드
const original = ['a',2,true,4,"hi"];
const copy = original.slice();
console.log(JSON.stringify(original) === JSON.stringify(copy)); // true
copy.push(10);
console.log(JSON.stringify(original) === JSON.stringify(copy)); // false
console.log(original); // [ 'a', 2, true, 4, 'hi' ]
console.log(copy); // [ 'a', 2, true, 4, 'hi', 10 ]
const original = [
{
a: 1,
b: 2,
},
true,
];
const copy = original.slice();
console.log(JSON.stringify(original) === JSON.stringify(copy)); // true
// 복사된 배열에만 변경.
copy[0].a = 99;
copy[1] = false;
console.log(JSON.stringify(original) === JSON.stringify(copy)); // false
console.log(original);
// [ { a: 99, b: 2 }, true ]
console.log(copy);
// [ { a: 99, b: 2 }, false ]
concat()
메서드는 기존 배열 뒤에 새로운 배열을 이어 붙여 새로운 배열을 반환let arr = [0, 1, 2];
let arr2 = [3, 4, 5];
console.log(arr.concat(arr2));
// [0, 1, 2, 3, 4, 5]
from()
메서드는 유사 배열 객체나 반복 가능한 객체(iterable object) 를 얕게 복사해서 새로운 Array 객체를 만든다console.log(Array.from('foo'));
// expected output: Array ["f", "o", "o"]
console.log(Array.from([1, 2, 3], x => x + x));
// expected output: Array [2, 4, 6]
Array.from(arrayLike[, mapFn[, thisArg]])
arrayLike
배열로 반환하고자 하는 유사 배열객체나 반복 가능한 객체mapFn
배열의 모든 요소에 대해 호출할 맵핑 함수 (선택 매개변수)thisArg
는 mapFn
실행 시에 this
로 사용할 값 (선택 매개변수)Object.assign()
에 첫번째 인자 값에 빈 객체를 주면, 구번째 값에 들어오는 출처 객체가 그대로 복사let obj = { name : 'hyelin', age : 18 };
let copy = Object.assign({}, obj);
console.log(obj === copy) // false (참조가 아닌 복사이므로)
copy.name = 'park';
console.log(obj); // { name : 'hyelin', age : 18 }
console.log(copy); // { name : 'park', age : 18 }
let obj1 = { name : 'hyelin', age : 18 };
let obj2 = { age : 25, job : 'student' };
Object.assign(obj1, obj2); // {name: 'hyelin', age: 25, job: 'student'}
let arr = [1, 2, 3];
let copy = [...arr];
console.log(arr === copy) // false
copy[0] = 'a';
console.log(arr) // [1, 2, 3];
console.log(copy) // ['a', 2, 3]
// 얕은 복사 spread
let obj = { name: 'hyelin', age: 25 };
let copy = { ...obj };
console.log(obj === copy); // false (참조가 아닌 복사이므로)
copy.name = 'park';
console.log(obj); // { name : 'hyelin', age : 25 }
console.log(copy); // { name : 'park', age : 25 }