
숫자 값은 1도, 1000000도 동일한 8바이트가 필요하지만,
문자열은 1개의 문자로 이루어진 경우 2바이트,
10개의 문자로 이루어진 경우 20바이트가 필요하다.
var str1 = ''; // 0개의 문자로 이루어진 문자열
var str2 = 'Hello'; // 5개로 이루어졌기 때문에 10바이트가 필요하다.
var str = 'Hello';
str = 'world';
위의 예제에서 첫번째 문이 실행되면 문자열 ‘Hello’가 생성되고
식별자 str은 문자열 ‘Hello’가 저장된 공간의 첫번째 메모리 셀 주소를 가리킨다.
두번째 문이 실행되면 이전에 생성된 문자열 ‘Hello’를 수정하는 것이 아니라
새로운 문자열 ‘world’를 메모리에 생성하고 식별자는 이것을 가리킨다.
이때 ‘Hello’와 ‘world’는 모두 메모리에 존재하는데, **식별자 str이 가리키는 위치가 변경되었을 뿐이다.**💡 유사 배열 객체
유사 배열 객체란 마치 배열처럼 인덱스로 프로퍼티 값에 접근할 수 있고
length 프로퍼티를 갖는 객체이다.
문자열은 배열처럼 인덱스를 통해 각 문자에 접근할 수 있으며,
length 프로퍼티를 갖기 때문에 유사배열객체이며,
for문으로 순회할 수 있다.var str = 'string'; // 문자열은 유사 배열이므로 배열과 유사하게 인덱스를 사용해 각 문자에 접근할 수 있다. console.log(str[0]); // s // 원시 값인 문자열이 객체처럼 동작한다. console.log(str.length); // 6 // 하지만 문자열은 원시값이므로 변경할 수 없다. str[0] = 'S'; console.log(str); // string ```
자바스크립트에 공식적으로는
‘값에 의한 전달’, ’참조에 의한 전달’이라는 용어는 존재하지 않는다
*score 변수에 값 80을 할당하고, copy 변수에 score변수를 할당했다.
그 후 score 변수에 새로운 값을 재할당하면?*
var score = 80;
var copy = score;
console.log(score); // 80
console.log(copy); // 80
score = 100;
console.log(score); // 100
console.log(copy); // ??
💡 자바스크립트 객체의 관리 방식
자바스크립트 객체는 프로퍼티 키를 인덱스로 사용하는
해시테이블이라고 생각할 수 있다.
대부분의 자바스크립트 엔진은 해시 테이블과 유사하지만
높은 성능을 위해 일반적인 해시테이블보다 나은 방법으로 객체를 구현한다.자바스크립트는 클래스 없이 객체를 생성할 수 있으며
객체가 생성된 이후라도 동적으로 프로퍼티와 메서드를 추가할 수 있다.
사용하기는 편리하지만 성능 면에서는
클래스 기반 객체지향 프로그래밍 언어의 객체보다 비효율적인 방식이다.따라서, V8 자바스크립트 엔진에서는 프로퍼티에 접근하기 위해
동적 탐색 대신 히든 클래스라는 방식을 사용한다.히든 클래스는 자바와 같이 고정된 객체 레이아웃과 유사하게 동작한다.
V8 엔진의 객체 관리 : Hidden Class와 속성 관리
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'
};
// 참조값을 복사(얕은 복사). copy와 person은 동일한 참조값을 갖는다.
var copy = person;
// copy와 person은 동일한 객체를 참조한다.
console.log(copy === person); // true
// copy를 통해 객체를 변경한다.
copy.name = 'Kim';
// person을 통해 객체를 변경한다.
person.address = 'Seoul';
// copy와 person은 동일한 객체를 가리킨다.
// 따라서 어느 한쪽에서 객체를 변경하면 서로 영향을 주고 받는다.
console.log(person); // {name: "Kim", address: "Seoul"}
console.log(copy); // {name: "Kim", address: "Seoul"}
** 다른 프로그래밍 언어와 의미가 정확히 일치하지 않는다는 점에 주의하자
Quiz
var person1 = {
name : 'Lee'
};
var person2 = {
name : 'Lee'
};
console.log(person1 === person2); // 1.?
console.log(person1.name === person2.name); // 2.?
false
전혀 다른 메모리 주소를 가지고 있는 별개의 객체이기 때문에 false이다.
true
두 객체의 네임은 모두 원시값 ‘Lee’로 평가된다.
따라서 답은 true이다.
var person = {
name: 'Lee'
};
var copy = person;
copy.name = 'Kim';
person.address = 'Seoul';
console.log(person); // {name: "___", address: "Seoul"}
console.log(copy); // {name: "Kim", address: "____"}