원시 타입 | 객체 타입 | |
---|---|---|
변경 여부 | x | o |
변수에 할당시 | 실제값 저장 | 참조 값이 저장 |
자신 타입의 다른 변수에 할당시 | 원본의 원시 값이 복사되어 전달 | 원본의 참조 값이 복사되어 전달 |
만약 값이 변한다면, 상태 변경을 추적하기 어렵다.
데이터의 신뢰성을 보장하며 이런 특성을 불변성
이라 한다.
다른 언어는
문자의 배열
orstring 객체
로 처리한다.
JavaScript는문자열
이라는 원시타입 객체를 제공한다.
문자열은 유사 배열 객체이면서 이터러블이므로 배열과 유사하게 각 문자에 접근할 수 있다.
유사배열 객체
: 배열처럼 인덱스로 프로퍼티 값에 접근할 수 있고 length프로퍼티를 갖는 객체.
var str = 'test';
console.log(str[0]); // t
str[0] = 'T'; // 원시 값이라서 변경 불가. 에러도 발생하지 않는다.
console.log(str); // test
값에 의한 전달 방식
주소에서 값을 복사하여 새로운 메모리에 할당하고 변수와 연결하는 것
ex) a = 메모리 1 = 80 , b = 메모리 2 = 80
같은 주소 할당, 재할당시 다른 메모리에 새로운 값 할당하는 것 (python)
ex) a, b = 메모리 1 = 80
var score = '80';
var copy = score;
score = 100;
console.log(score) // 100
console.log(copy) // 80
// 여기는 1번처럼 움직인다!
객체는 프로퍼티의 개수가 정해져 있지 않고, 동적으로 추가되고 삭제할 수 있고, 제약도 없다.
따라서 메모리 공간을 사전에 정해 둘 수 없다.
var person = {
name : 'Lee',
test : {
age : 20
}
};
var copy = person;
copy.name = 'kim' // person, copy 둘 다 바뀜
copy.test.age = '22' // person, copy 둘 다 바뀜
console.log(person) // {name : 'kim', test:{age:'22'}};
console.log(copy) // {name : 'kim', test:{age:'22'}};