• 원시 타입의 값, 즉 원시 값은 변경 불가능한 값이다. 이에 비해 객체(참조)타입의 값, 즉 객체는 변경 가능한 값이다.
• 원시 값을 변수에 할당하면 변수(확보된 메모리 공간)에는 실제 값이 저장된다. 이에 비해 객체를 변수에 할당하면 변수(확보된 메모리 공간)에는 참조 값이 저장된다.
• 원시 값을 갖는 변수를 다른 변수에 할당하면 원본의 원시 값이 복사되어 전달된다.(값에 의한 전달) 이에 비해 객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조 값이 복사되어 전달된다(참조에 의한 전달)
원시 타입의 값, 즉 원시 값은 변경 불가능한 값이다.
변수 : 하나의 값을 저장하기 위해 확보한 메모리 공간 자체 또는 그 메모리 공간을 식별하기 위해 붙인 이름
값: 변수에 저장된 데이터로서 표현식이 평가되어 생성된 결과
즉, 변경 불가능하다는 것은 변수가 아니라 값에 대한 진술이다.
("원시 값은 변경 불가능하다"는 말은 원시 값 자체를 변경할 수 없다는 것이지 변수 값을 변경할 수 없다는 것이 아니다.)
var num;
num = 80;
num = 100;
위 그림처럼 변수가 선언되고 원시 값이 할당되면 메모리 안에서 값이 바뀌는 것이 아니라 메모리 공간의 주소를 바꿔서 값을 할당한다.
불변성을 갖는 원시 값을 할당한 변수는 재할당 이외에 변수 값을 변경할 수 있는 방법이 없다.
원시 값을 저장하려면 먼저 확보해야 하는 메모리 공간의 크기를 결정해야 한다.
var str = 'Hello';
str = 'World"
메모리에 str변수에 해당하는 메모리 공간을 확보하고, 'Hello' 문자열을 저장한다. 값이 재할당 되었을 경우 같은 메모리 공간에서 값이 바뀌는 것이 아니라(즉, Hello -> World) 다른 메모리공간에 "World"를 입력 후 변수가 가리키는 메모리공간을 바꾼다.
var str = 'string';
str[0] = 'S';
// 문자열은 원시 값이므로 변경할 수 없다. 이때 에러가 발생하지 않는다.
console.log(str); // string
var score = 80;
var copy = score;
console.log(score); // 80
console.log(copy); // 80
score = 100;
console.log(score); // 100
console.log(copy); // 80
위 그림처럼 변수에 원시 값을 갖는 변수를 할당하면 할당받는 변수(copy)에는 할당되는 변수(score)의 원시 값이 복사되어 전달된다.
처음 copy = score 부분에서 copy는 score의 값만 전달받아서 생성했다. 즉, score 변수와 copy 변수의 값 80은 다른 메모리 공간에 저장된 별개의 값이다.
참고로 "값에 의한 전달" 이라는 용어는 자바스크립트를 위한 용어가 아니므로 사실 오해가 있을 수도 있다. 엄격하게 표현하면 변수에는 값이 전달되는 것이 아니라 메모리 주소가 전달되기 때문이다. 이는 변수와 같은 식별자는 값이 아니라 메모리 주소를 기억하고 있기 때문이다.
객체는 프로퍼티의 개수가 정해져 있지 않으며, 동적으로 추가되고 삭제할 수 있다. 또한 프로퍼티의 값에도 제약이 없다. 따라서 객체는 원시 값과 같이 확보해야 할 메모리 공간의 크기를 사전에 정해 둘 수 없다.
객체(참조) 타입의 값, 즉 객체는 변경 가능한 값이다.
var person = {
name : 'Lee'
}
원시 값을 할당한 변수가 기억하는 메모리 주소를 통해 메모리 공간에 접근하면 원시 값에 접근할 수 있다. 즉, 원시 값을 할당한 변수는 원시 값 자체를 값으로 갖는다.
var person = {
name : 'Lee'
}
// 프로퍼티 값 갱신
person.name = 'Kim';
// 프로퍼티 동적 생성
person.address = 'Seoul';
console.log(person); //{name: "Kim", address: "Seoul"}
원시 값은 변경 불가능한 값으로 원시 값을 갖는 변수의 값을 변경하려면 재할당 외에는 방법이 없다. 하지만 객체는 변경 가능한 값이다. 즉, 객체를 직접 변경할 수 있으므로, 재할당 없이 프로퍼티를 동적으로 추가할 수도 있고 프로퍼티 값을 갱신할 수도 있으며 프로퍼티 자체를 삭제할 수도 있다.
var person = {
name : 'Lee',
}
//참조 값을 복사(얕은 복사)
var copy = person;
두 개의 식별자가 하나의 객체를 공유한다.
var person = {
name: "Lee"
}
var copy = person;
console.log(copy === person) // true
copy.name = 'Kim';
person.address = 'Seoul';
console.log(person) // {name: 'Kim', address: "Seoul"}
console.log(copy) // {name: 'Kim', address: "Seoul"}
var person1 = {
name: 'Lee'
}
var person2 ={
name : 'Lee'
}
console.log(person1 === person2); // false
console.log(person1.name === person2.name) // true
글 잘 봤습니다, 많은 도움이 되었습니다.