원시 타입과 객체 타입의 대표적 차이점

1️⃣

원시 타입의 값 === 원시 값변경 불가능한 값(immutable value) 이다. 객체 타입의 값 === 객체변경 가능한 값(mutable value) 이다.

2️⃣

원시 값을 변수에 할당하면 변수에는 실제 값이 저장된다. 객체를 변수에 할당하면 변수에는 참조 값이 저장돤다.

3️⃣

원시 값을 갖는 변수를 다른 변수에 할당하면 원시 값이 복사되어 전달 → 값에 의한 전달(pass by value) 객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조 값이 복사되어 전달 → 참조에 의한 전달(pass by reference)

원시 값

원시 값은 변경 불가능한 값(immutable value) == 읽기 전용(read only) 값

// 💡 변수 vs 상수

변수(variable)
+ 변수는 언제든지 "재할당"을 통해 변수 값을 변경(= 정확히는 "교체")할 수 있다. 그래서 "변수"다.

상수(constant)
+ 상수도 값을 저장하기 위한 메모리 공간이 필요하므로 "변수"라고 할 수 있다.
+ 하지만, 상수는 단 한 번만 할당이 허용하므로 변수 값을 변경(= 정확히는 "교체")할 수 없다. 

불변성

불변성(immutability) = 변수 값을 변경하기 위해 원시 값을 재할당하면 새로운 메모리 공간을 확보하고 재할당한 값을 저장한 후, 변수가 참조하던 메모리 공간의 주소를 변경하는 것

// 'string' 에서 첫 번째 's' 를 'S' 로 변경하려 하지만 str 변수는 "문자열, 즉 원시 값"
// 원시 값은 변경 불가능한 값(immutable value) -> 값이 업데이트 되지 않는다.
var str = "string";
str[0] = "S";       

console.log(str);   // "string"

// 재할당으로 값을 변경하는 것은 가능
var str = 'Hello';
str = 'World';

console.log(str);   // "World"  
💡 유사 배열 객체

+ 배열처럼 인덱스로 프로퍼티 값에 접근할 수 있으며, length 프로퍼티를 갖는 객체
+ length 프로퍼티를 갖기 때문에 "유사 배열 개체" 이며, for 문으로 순회도 가능

값에 의한 전달