var / let / const
- var
- 함수 레벨 스코프(블록 X)
- 변수 선언시, 런타임 이전 변수의 선언과 초기화(undefined) 동시 발생 및 호이스팅에 의해 스코프의 선두로 끌어 올려진 것처럼 동작(참조 오류 발생 X) => 선언 이전에 호출하여도 에러 X
- 중복 선언 및 재할당 가능
- let(ES6~)
- 블록 레벨 스코프
- 중복 선언 불가, 재할당 가능
- 변수 호이스팅이 발생하지만, 변수의 선언과 초기화단계가 분리(선언 단계는 런타임 이전, 초기화 단계는 런타임에 발생)됨으로써 선언 이전 호출하였을때 참조 에러 발생(스코프 시작점부터 변수의 초기화 시작 지점까지의 변수 참조가 불가능한 TDZ에 빠지게 된다.)
- const(ES6~)
- 블록 레벨 스코프
- 변수의 선언, 초기화, 할당이 동시에 필요하다.
- 중복 선언 및 재할당 불가
데이터 프로퍼티, 접근자 프로퍼티
- 데이터 프로퍼티
- 키와 값으로 구성된 일반적인 프로퍼티(일반적인 객체에서 확인 가능)
- 데이터 프로퍼티는 다음과 같은 프로제퍼티 어트리뷰트를 갖고 있다.
- value: 키 접근으로 반환하는 값
- writable: 프로퍼티 값의 변경 여부
- enumerable: 프로퍼티 열거 가능 여부
- configurable: 프로퍼티 재정 여부
const person = {
firstName: "Yongmin",
lastName: "Jeon",
};
console.log(Object.getOwnPropertyDescriptors(person));
// {
// firstName: {
// value: 'Yongmin',
// writable: true,
// enumerable: true,
// configurable: true
// },
// lastName: {
// value: 'Jeon',
// writable: true,
// enumerable: true,
// configurable: true
// }
// }
- 접근자 프로퍼티
- 자체적으로 값은 없으며, 다른 데이터 프로퍼티의 값을 읽거나 저장할때 사용하는 접근자 함수로 구성되어 있다.
- 접근자 함수인 getter/setter 는 선택적으로 정의하고 사용할 수 있다.
const person = {
firstName: "Yongmin",
lastName: "Jeon",
};
Object.defineProperty(person, "fullName", {
// getter 함수
get() {
return `${this.firstName}/${this.lastName}`;
},
// setter 함수
set(name) {
[this.firstName, this.lastName] = name.split(" ");
},
});
console.log(person, person.fullName); // { firstName: 'Yongmin', lastName: 'Jeon' }, 'Yongmin/Jeon'
person.fullName = "Bruce Wayne";
console.log(person, person.fullName); // { firstName: 'Bruce', lastName: 'Wayne' }, 'Bruce/Wayne'
'JavaScript' 카테고리의 다른 글
[DeepDive] - 20장(strict mode), 21장(빌트인 객체) 필요 내용 정리 (0) | 2022.06.14 |
---|---|
[DeepDive] - 17장(생성자 함수에 의한 객체 생성) 필요 내용 정리 (0) | 2022.06.09 |
[DeepDive] 13장(스코프), 14장(전역 변수의 문제점) 필요 내용 정리 (0) | 2022.06.07 |
[DeepDive] 11장(원시값과 객체의 비교), 12장(함수) 필요 내용 정리 (0) | 2022.06.06 |
[DeepDive] 1~10장 필요 내용 정리 (0) | 2022.06.03 |