원시 값
변수에 할당하면 변수에 실제 값이 저장됨
객체 값
변수에 할당하면 변수에 참조 값이 저장됨
값을 변경할 수 없다는 것이란?
변수 : 메모리 공간을 식별하기위해 붙인 이름
값 : 변수에 저장된 데이터로서 표현식이 평가되어 생성된 결과
=> 원시 값 자체를 변경할 수 없다는 것이지 변수 값을 변경할 수 없다는 것이 아님
새로운 원시 값을 재할당하면 메모리 공간에 저장되어 있는 재할당 이전의 원시 값을 변경한느 것이 아니라, 새로운 메모리 공간을 확보하고 재할당한 원시 값을 저장한 후 변수는 새롭게 재할당한 원시 값을 가리킴
만약, 원시 값이 변경 가능한 값이라면 원시 값 자체를 변경하면 그만이다. 그렇다면 변수가 참조하던 메모리 공간의 주소는 바뀌지 않음. 하지만 원시 값은 변경 불가능한 값이기 때문에 재할당으로만 변수 값을 변경가능함 => 불변성
var str = 'Hello';
str = 'world';
var str = 'string';
console.log(str[0]); // s
할당받는 변수에는 할당되는 변수의 원시 값이 복사되어 전달됨
var score = 80;
// copy 변수에는 score 변수의 값 80이 복사되어 할당됨
var copy = score;
console.log(score, copy); // 80 80
console.log(score === copy); // true
=> score변수와 copy변수의 값 80은 달느 메모리 공간에 저장된 별개의 값
엄격하게 표현하면 변수에는 값이 전달되는 것이 아니라 메모리 주소가 전달됨
변수와 같은 식별자는 값이 아니라 메모리 주소를 기억하고 있기 때문임
식별자로 값을 구별해서 식별한다는 것은 식별자가 기억하고 있는 메모리 주소를 통해 메모리 공간에 저장된 값에 접근할 수 있다는 의미
즉, 식별자는 메모리 주소에 붙인 이름
값에 의한 전달은 사실 값을 전달하는 것이 아니라 메모리 주소를 전달함
전달된 메모리 주소를 통해 메모리 공간에 접근하면 값을 참조할 수 있음
// 할당이 이뤄지는 시점에 객체 리터럴이 해석되고, 그 결과 객체가 생성됨
var person = {
name: 'Lee'
};
// person 변수에 저장되어 있는 참조 값으로 실제 객체에 접근한다.
console.log(person); // {name: "Lee"}
메모리를 효율적으로 사용하기위해 객체는 변경 가능한 값으로 설계되어 있음
var person = {
name: 'Lee'
};
// 참조 값을 복사(얕은 복사)
var copy = person;
=> 원본 person의 참조 값을 복사해서 copy에 저장
따라서, 원본 또는 사본 중 어느 한쪽에서 객체를 변경(변수에 새로운 객체를 재할당하는 것이 아니라 객체의 프로퍼티 값을 변경하거나 프로퍼티를 추가, 삭제)하면 서로 영향을 주고 받는다.
===
를 통해 객체를 할당한 변수를 비교하면 참조 값을 비교하고, 원시 값을 할당한 변수를 비교하면 원시 값을 비교함
var person1 = {
name: 'Lee'
};
var person2 = {
name: 'Lee'
};