데이터를 복사할 때에, a = b; 이렇게만 하면 복사가 완벽히 일어날 것 같지만 모든 데이터가 그렇게 동작하지 않는다.
데이터의 종류에 따른 복사를 알아보장.
Primitive data type
값이 변수에 그대로 저장된다. 그래서 복사가 완벽하게 일어난다.
var 이름1 = '김';
var 이름2 = 이름1;
이름1 = '박';
console.log(이름1, 이름2) // '박', '김' 출력됨.
Reference data type
자료를 변수에 직접 저장하는게 아니라, 자료가 어디에 있는지를 알려주는 레퍼런스를 변수에 저장한다.
array, obj가 바로 Reference data type 이다.
var 이름1 = {name : '김'} // 참조값이 저장됨.
var 이름2 = 이름1 //이말은 {name : '김'} 이 저기 저장되었다는 참조값만. 복사됨.
이름1.name = '박';
console.log(이름1, 이름2) // name : "박" name : "박" 출력됨.
그래서 제대로 object 를 복사하고 싶다면, constructor 문법을 이용해서 복사해야 한다.
var name1 = {name : '김'};
var name2 = {name : '김'};
console.log(name1 == name2) //값은 false
console.log(name1.name === name2.name) //값은 true
false 가 나오는 이유는 각각 다른 레퍼런스 이기 때문에 당연하다. .
그렇지만 true 가 나오는 경우도 있는데, 이는 각각 다른 레퍼런스 이지만, 그 안에 할당된 값을 비교하기 때문에.
그럼 아래의 경우는?
var name4 = {name : '김'};
function 변경경(obj){
obj = {name : 'kim' };
}
변경경(name4)
console.log(name4) //{name: '김'}
name4에 새로운 값을 재할당 해서 출력값이 {name : 'kim'} 이 나오기를 기대했지만, 다른게 나왓다.
이유가 뭘까?
1. 변경경(name4)
이렇게 해줌에 따라서, 우리는 변경경 이라는 함수에 파라미터로 변수 name4를 넣어주고 있다.
그러면 함수의 파라미터는 이렇게 해석한다. var obj = name4
이건 곧 변수 obj에 name4의 레퍼런스 값을 할당한다는 의미이다.
2. obj ={name : 'kim'}
컴퓨터 시선에서는 선언된 변수 obj에 {name : 'kim'}를 직접 할당해 준것.
의도했던 name4에는 할당되지 않았다.
만약 오브젝트를 할당하지 않고, 오브젝트의 키에 대한 값을 할당했다면 ? 잘 동작한다.
obj.name = 'kim' 이런식으로 말이다.
3. 그 결과 console.log(name4)는 원래 가지고 있던 오브젝트를 출력했다.
선언된 변수 obj에 {name : 'kim'}를 직접 할당해 준것 이기 때문에..
'JS (Java Script)' 카테고리의 다른 글
프로토타입 ( prototype ) 과 __proto__ 차이 명확하다 // 상속 구현하기 (0) | 2023.09.07 |
---|---|
constructor function 생성자 함수 (0) | 2023.09.07 |
나머지 파라미터 (Rest 파라미터) / spread operator 과 구분 (0) | 2023.09.06 |
arguments 에 대해서.. (함수의 파라미터 모두를 한꺼번에 다루고 싶을 때) (0) | 2023.09.06 |
함수의 default 파라미터 (자바스크립트 no 엄격) (0) | 2023.09.06 |