Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

동그란 도그린

[모던 자바스크립트 Deep Dive🦎] 10장 : 객체 리터럴 본문

FrontEnd/Javascript

[모던 자바스크립트 Deep Dive🦎] 10장 : 객체 리터럴

도그rin 2023. 4. 6. 20:17

📍 객체

  • 자바스크립트는 객체 기반의 프로그래밍 언어
  • 객체는 원시 값을 제외한 나머지 값(함수, 배열, 정규 표현식 등)
  • 원시 값은 변경 불가능한 값, 객체 값은 변경 가능한 값
  • 객체는 0개 이상의 프로퍼티로 구성된 집합

 

  • 프로퍼티
    • 프로퍼티는 키와 값으로 구성
    • 모든 값은 프로퍼티가 될 수 있음
    • 프로퍼티 값이 함수이면, 이를 메서드라고 부름
    • 객체는 프로퍼티와 메서드로 구성된 집합체
      • 프로퍼티 : 객체의 상태
      • 메서드 : 프로퍼티를 참조하고 조작할 수 있는 동작

 

📍 객체 리터럴에 의한 객체 생성

  • 자바스크립트는 프로토타입 기반 객체지향 언어로, 다양한 객체 생성 방법 지원
    1. 객체 리터럴
    2. Object 생성자 함수
    3. 생성자 함수
    4. Object.create 메서드
    5. 클래스(ES6)

 

  • 객체 리터럴
    • 중괄호 내에 0개 이상의 프로퍼티 정의
    • 객체 리터럴의 중괄호는 코드 블록을 의미하지 X, 객체 리터럴은 값으로 평가되는 표현식이므로 뒤에 세미콜론을 붙임
    • 프로퍼티를 정의하지 않으면 빈 객체 생성
var empty = {}; // 빈 객체
console.log(typeof empty);  // => object

 

📍 프로퍼티

  • 프로퍼티 나열 시 쉼표( , )로 구분
  • 프로퍼티 키는 반드시 식별자 네이밍 규칙을 따라야 하는 것은 아님, 따르지 않는 이름에는 반드시 따옴표로 묶어야 함
var person = {
	firstName : 'Ung-mo',   // 식별자 네이밍 규칙을 따르는 프로퍼티 키
	'last-name' : 'Lee',    // 식별자 네이밍 규칙을 따르지 않는 프로퍼티 키
};

 

  • 빈 문자열을 프로퍼티 키로 사용해도 에러 발생 X, 하지만 키로서의 의미를 갖지 못하므로 권장 X
var foo = {
	'': ''
};

console.log(foo); // {"": ""}

 

  • 프로퍼티 키에 문자열이나 심벌 값 외의 값을 사용하면 암묵적 타입 변환으로 인해 문자열이 됨
  • 예약어를 프로퍼티 키로 사용해도 에러 발생 X, 에러 발생 여지가 있으므로 권장 X
  • 이미 존재하는 프로퍼티 키를 중복 선언하면 먼저 선언한 프로퍼티를 덮어쓰고, 에러 발생 X
var foo = {
	name: 'Lee',
	nmae: 'Kim'
};

console.log(foo);  // {name: "Kim"}

 

📍 프로퍼티 접근

  • 프로퍼티 접근 방법은 2가지
    1. 마침표 표기법 : 마침표 프로퍼티 접근 연산자( . )를 사용
    2. 대괄호 표기법 : 대괄호 프로퍼티 접근 연산자( […] )를 사용
  • 자바스크립트에서 사용 가능한 유효한 이름이면 2가지 방법 모두 사용 가능
  • 대괄호 표기법을 사용하는 경우, 프로퍼티 키는 반드시 따옴표로 감싼 문자열이어야 함, 프로퍼티 키가 숫자로 이루어진 문자열인 경우에는 따옴표 생략 가능 (감싸지 않으면 자바스크립트 엔진이 식별자로 해석함)
var person = {
	nmae: 'Lee'
};

console.log(person[name]);  // ReferenceError: name is not defined

 

  • 객체에 존재하지 않는 프로퍼티에 접근하면 undefined를 반환, ReferenceError 발생 X
var person = {
	name: 'Lee'
};

console.log(person.age);  // undefined

 

📍 프로퍼티 값 갱신

  • 이미 존재하는 프로퍼티에 값을 할당하면 프로퍼티 값이 갱신됨

 

📍 프로퍼티 삭제

  • delete 연산자를 통해 객체의 프로퍼티를 삭제
  • 존재하지 않는 프로퍼티를 삭제하면 에러 없이 무시됨

 

📍 ES6에서 추가된 객체 리터럴의 확장 기능

  • ES6에서는 프로퍼티 값으로 변수 사용 시, 변수 이름과 프로퍼티 키가 동일한 이름이면 프로퍼티 키 생략 가능
let x = 1, y = 2;

const obj = { x,y };
console.log(obj);  // {x: 1, y: 2}

 

  • ES6에서는 계산된 프로퍼티 이름으로 프로퍼티 키 동적 생성 시 객체 리터럴 외부에서 대괄호 표기법을 사용하는 법 외에 객체 리터럴 내부에서도 동적 생성 가능
// ES5
var prefix = 'prop';
var i = 0;
var obj = {};

// 객체 리터럴 외부에서 대괄호 표기법 이용
obj[prefix + '-' + ++i] = i;

console.log(obj); // => {prop-1: 1}
// ES6
const prefix = 'prop';
let i = 0;

// 객체 리터럴 내부에서 동적 생성
const obj = {
	[`${prefix}-${++i}`]: i
};

console.log(obj); // => {prop-1: 1}

 

  • ES6에서 메서드 정의 시 function 키워드 생략 가능
// ES5
var obj = {
	sayHi: function() {
		console.log('Hi');
	}
};

obj.sayHi();  // Hi
// ES6
const obj = {
	sayHi() {
		console.log('Hi');
	}
};

obj.sayHi();  // Hi
Comments