원시 값(Primitive value) vs 객체(Object)
- 원시 값은 값이 공유되지만, 객체는 reference가 복사된다.
- 결과적으로 같은 객체 지칭
원시 타입(Primitive type) | 객체 타입(Object) | |
값 | immutable | mutable |
할당 | 실제 값 저장 | 참조 값 저장 |
재할당 | 원시 값 복사 | 참조 값 복사 |
전달 방식 | pass by value | pass by reference |
원시 타입
- 원시 값은 변경이 불가능하다.
- 원시 값을 재할당하기 위해서는 새로운 메모리 공간에서 재할당 값을 저장하고, 참조 변수의 메모리 공간 주소를 변경해야한다.
객체 타입
- 참조 값(reference value)에 접근할 수 있는 메모리 주소를 기억할 수 있다.
ex. var obj = {name: '홍길동'}
- 객체 리터럴을 통해(객체 생성 방법 중 하나) 객체가 생성된다.
- 원시 값을 할당한 변수 obj를 참조하면, 메모리 주소 0x23에 저장되어 있는 값에 접근한다.
- 메모리에 저장되어 있는 참조 값 0x99를 통해서 실제 객체 {name: '홍길동'}에 접근할 수 있다.
유사 배열 객체(Array Like Object)
- 배열처럼 index로 프로퍼티 값에 접근이 가능하고, length 프로퍼티를 갖는 객체이다.
- 배열처럼 index로 문자에 접근이 가능하다.
ex. primitive value인 'hello'는 래퍼 객체(wrapper Object)에 의해 자동 변환되어 객체로 변환해준다.
- 작업이 끝나면 다시 원시 값으로 되돌아온다.
- 문자열은 원시 값이기 때문에 변하지 않는다.
ex. let myStr = '홍길동';
- 객체가 만들어지고, myStr이 할당된다.
- 그리고, length가 정해지고
- 배열처럼 사용할 수 있도록 0,1,2에 각각 키 값들이 만들어지고 각각 할당된다.
- 밑에도 여러가지 값들이 상속 되어 들어오게 된다.
- myStr[0] 을 실행하면 0:홍을 가져와서 홍이 출력된다.
- 객체를 복사하면, 생성하는 비용을 절약할 수 있다.
- 하지만 이런 장점이 여러 개의 식별자가 하나의 객체를 공유할 수 있다는 단점이 존재한다.
값에 의한 전달(pass by value)
- 할당받는 변수에는 변수의 원시 값이 복사되어 전달된다.
- scode변수와 copy의 값 80은 서로 다른 메모리 공간에 저장된 별개의 값이다.
참조에 의한 전달
let person = {name: 'Lee'}
let copy = person;
- 객체를 가리키는 person을 다른 변수 copy에 할당하면, 원본의 참조 값이 복사된다.
- 두 개의 변수가 동일한 객체의 주소를 갖는다.
- 두 변수는 지정된 메모리 주소는 다르지만, 동일한 참조 값을 갖는다.
- 한쪽에서 값이 변경되면 다른쪽도 영향을 받는다.
- 자바스크립트에서는 '참조에 의한 전달'은 존재하지 않고, '값에 의한 전달'만 존재한다고 말할 수도 있다.
얕은복사 Shallow copy, 깊은 복사 Deep Copy
- 얕은 복사 : 객체의 한 단계만 복사
- 깊은 복사 : 객체에 중첩되어 있는 모든 객체 복사
옵저버(Observer) 패턴
- 객체의 변경은 복잡한 코드에서 객체의 변경 추적을 어렵게 한다.
- 객체의 변경을 추적하기 위해 옵저버 패턴을 사용하여 객체를 참조하는 모든 이들에게 변경 사실을 알리고 대처하는 추가 대응이 필요하다.
순수 함수
- 외부 상태를 변경하지 않고 외부 상태에 의존하지도 않는 함수
- 함수형 프로그래밍 : 순수 함수를 통해 프로그램의 안전성을 높이는 프로그래밍 패러다임
'프로그래밍 > JS' 카테고리의 다른 글
[JavaScript] 함수 호출, 즉시 실행 함수, 중첩 함수, 스코프 (0) | 2022.07.05 |
---|---|
[JavaScript] 자바스크립트 함수, 함수 정의방법(선언문, 표현식, 화살표) (0) | 2022.07.05 |
[JavaScript] 자바스크립트 객체와 프로퍼티 (0) | 2022.07.05 |
[JavaScript] var, let, const 자바스크립트 변수, 템플릿 문자열 (0) | 2022.07.05 |
[JavaScript] 변수, 식별자(Identifier), undefined, execution context, 호이스팅 (0) | 2022.07.04 |