10. 모던 자바스크립트 Deep Dive (객체 리터럴)

⛅️ 객체란?

  • 객체 타입: 다양한 타입의 값(원시값, 또 다른 객체)을 하나의 단위로 구성한 것
  • 원시타입 = 변경 불가능한 값, 객체타입 = 변경 가능한 값
  • 프로퍼티는 키와 값으로 구성됨
  • 함수도 프로퍼티로 사용 가능(자바스크립트의 함수는 일급 객체 이기때문)
  • 프로퍼티와 메서드로 구성된 집합체
❓일급 객체
  - 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체
  - 데이터(string, number, boolean, array, object) 다루 듯이 다룰 수 있다. 즉, 값으로 사용 가능하다.

❓일급객체의 조건
  - 변수에 할당(assignment)할 수 있다.
  - 다른 함수를 인자(argument)로 전달 받는다.
  - 다른 함수의 결과로서 리턴될 수 있다.

⛅️ 객체리터럴을 통한 객체 생성 방법

  • 중괄호 ({...}) 내에 0개 이상의 프로퍼티를 정의
  • 변수에 할당되는 시점에 자바스크립트 엔진이 객체 리터럴을 해석하고 객체를 생성함
  • 객체 리터럴은 값으로 평가되는 표현식 => 닫는 중괄호 뒤에는 세미콜론 를 붙여야함
var donggyun = {
  hobby: 'coding',
  age: 25,
  introduce: function () {
    console.log(`hello my hobby is ${this.hobby}`);
  },
};

console.log(typeof donggyun); // object
console.log(donggyun); // {hobby:'coding', age:25, introduce:f}
  • 이외의 객체 생성 방법
    • Object 생성자 함수
    • 생성자 함수
    • Object.create 메서드
    • 클래스

⛅️ 프로퍼티

  • 객체는 프로퍼티의 집합
  • 프로퍼티는 키와 값으로 구성
  • 프로퍼티를 나열할때는 쉼표(,)로 구분
  • 식별자 네이밍 규칙을 따르지 않는 이름에는 따옴표 사용해야 함
var person = {
  // 프로퍼티 키 = name
  // 프로퍼티 값 = 'donggyun'
  name: 'donggyun',
};
  • 프로퍼티 키 동적 생성 예제
var obj = {};
var key = 'hello';

// 프로퍼티 키로 사용할 표현식을 대괄호([...])로 묶어야 함
obj[key] = 'world';
console.log(obj); // {hello: 'world'}
  • 프로퍼티 키 중복 선언
var me = { name: 'dong', name: 'gyun' };

// 나중에 선언한 프로퍼티가 먼저 선언한 프로퍼티를 덮어쓴다
// 에러 발생 X
console.log(me); // {name:'gyun'}

메서드

  • 함수는 일급 객체 이기때문에 함수는 값으로 취급할 수 있다.
  • 따라서 함수는 프로퍼티의 값으로 사용 가능
  • 메서드는 객체에 묶여있는 함수를 의미함.
var circle = {
  // 프로퍼티
  radius: 5;

  // 메서드
  getDiameter = functuon() {
    return 2 * this.radius;
  }
};

console.log(circle.getDiameter()); // 10

⛅️ 프로퍼티 접근 방법

  • 마침표 표기법: 접근 연산자(.) 를 사용
  • 대괄호 표기법: 대괄호 프로퍼티([...]) 사용
    (프로퍼티가 네이밍 규칙을 준수한다면 위의 접근 방법 모두 사용 가능)
var person = { name: 'donggyun' };

console.log(person.name); // 'donggyun'

// 대괄호 표기법 내의 프로퍼티 키는 반드시 따옴표로 감싼 문자열이어야 함!!
// 따옴표로 감싸지 않으면 자바스크립트 엔진은 변수와같은 식별자로 해석함
console.log(person['name']); // 'donggyun'
console.log(person[name]); // ReferenceError

// 객체에 존재하지 않는 프로퍼티는 undefeind를 반환
// 에러 X
console.log(person.age); // undefined
  • Node.js 환경과 브라우저 환경의 객체 접근 차이점
    • 아래의 예제에서 person.last-name 을 평가할때 person.last를 먼저 평가하여
      person.undefined-name 이 된다.
    • 브라우저 환경에서는 name이라는 전역변수(window의 프로퍼티)가 암묵적으로 존재하기 때문에
      person.last-name => person.undefined-'' 와 같게되므로 NaN 가 된다.
    • Node.js 환경에서는 name 이라는 식별자가 없기때문에 ReferenceError 가 된다.
var person = {
  'last-name'L 'donggyun',
  1:10
};

person.'last-name'; // SyntaxError
person.last-name;   // 브라우저 환경: NaN
                    // Node.js 환경: ReferenceError

person[last-name];   // ReferenceError
person['last-name']; // Lee

person.1;   // SyntaxError
person.'1'  // SyntaxError
person[1];   // 10
person['1']; // 10

⛅️ 프로퍼티 동적 생성, 프로퍼티 삭제

var person = {
  name: 'donggyun',
};

// 없는 프로퍼티에 값을 할당했을때 프로퍼티가 동적으로 생성되고 값이 할당된다.
person.age = 25;
console.log(person); // {name:'donggyun', age:25}

// 존재하는 프로퍼티를 삭제할 수 있다.
// 존재하지 않는 프로퍼티를 삭제했을때는 아무일도 안일어난다. 에러 X
delete person.age;
delete person.hobby;

console.log(person); // {name:'donggyun'}

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

  • 프로퍼티 축약 표현
    • 프로퍼티 값으로 변수를 사용하는 경우 변수 이름과 키가 동일한 이름일때 프로퍼티 키를 생략할 수 있다.
    • 프로퍼티 키는 변수 이름으로 자동 생성
var x = 1,
  y = 2;

var obj = { x, y };
console.log(obj); // {x:1, y:2}
  • 계산된 프로퍼티 이름
    • 문자열로 타입 변환할 수 있는 값으로 평가되는 표현식을 사용해서 프로퍼티 키를 동적으로 생성 가능
    • 프로퍼티 키로 사용될 표현식을 대괄호([...])로 묶어야 함.
const s = 'hello';
let idx = 0;

const obj = {
  [`${s}-${++idx}`]: idx,
  [`${s}-${++idx}`]: idx,
  [`${s}-${++idx}`]: idx,
};

console.log(obj); //{hello-1: 1, hello-2:2, hello-3:3}
  • 메서드 축약 표현
    • 메서드를 정의할 때 function 키워드를 생략 가능
    • 축약 표현으로 정의한 메서드는 프로퍼티에 할당한 함수와 다르게 동작하는데 이는 26장에서 살펴볼 내용
const obj = {
  intoruce() {
    console.log('hello world!!');
  },
};

obj.introduce(); // hello world!!

 

📚 REFERENCE

  • 모던 자바스크립트 Deep Dive 10장 객체 리터럴