JS Study 2주차 ( 객체 리터럴 / 원시값과 객체의 비교 )

jaehan·2022년 5월 12일
0

JavaScript

목록 보기
7/33
post-thumbnail

💻 객체 리터럴

자바스크립트는 객체 기반의 프로그래밍 언어이며, 자바스크립트를 구성하는 "모든것"이 객체이다.

원시값을 제외한 나머지 값은 모두 객체이다

✔️ 원시 타입의 값, 즉 원시 값은 변경 불가능한 값이지만, 객체 타입의 값, 즉 객체는 변경 가능한 값이다.

let person = {
	name: 'Kim', // 프로퍼티
  	age:   20 // 프로퍼티
   // 키   값
}

객체는 0개 이상의 프로퍼티로 구성된 집합이며, 프로퍼티는 키와 값으로 구성된다.

  • 프로퍼티 : 객체의 상태를 나타내는 값
  • 메서드: 프로퍼티를 참조하고 조작할 수 있는 동작

💡 객체 생성

자바스크립트는

  • 객체 리터럴
  • Object 생성자 함수
  • 생성자 함수
  • Object.create 메서드
  • 클래스(ES6)

의 방법으로 객체를 만들 수 있다.
📌 그중에서 객체 리터럴을 사용하는게 가장 일반적이고 간단하다

let person = {
  name: 'Lee',
  sayHello: function() {
    console.log('');
  }
};

📌 객체 리터럴은 값으로 평가되는 표현식이기 때문에 닫는 중괄호 뒤에는 ;를 붙힌다


💡 프로퍼티

객체는 프로퍼티의 집합이며, 프로퍼티는 키와 값으로 구성된다

  • 프로퍼티 키: 빈 문자열을 포함하는 모든 문자열 또는 심벌 값
  • 프로퍼티 값: 자바스크립트에서 사용할 수 있는 모든 값

📌 식별자 네이밍 규칙을 따르지 않는 이름에는 프로퍼티 키를 구성할 때 반드지 따옴표로 묶어줘야 한다

let person = {
	firstName: 'jaehan',
    last-name: 'Kim' // SyntaxError
 // => "last-name"
}

문자열 또는 문자열로 평가할 수 있는 표현식을 사용해 프로퍼티 키를 동적으로 생성할 수 도 있다

let obj = {};
obj['Hello'] = 'world';

// obj = {'Hello' : 'world'}

📌 프로퍼티 키에 문자열이나 심벌 값 외의 값을 사용하면 암묵적 타입변환을 통해 문자열이 된다
📌 이미 존재하는 프로퍼티 키를 중복 선언하면 나중에 선언한 프로퍼티가 덮어쓴다


💡 메서드

자바스크림트 함수는 일급 객체라 값으로 취급할 수 있기 때문에 프로퍼티 값으로 사용 할 수 있다.
프로퍼티 값이 함수일 경우 메서드라 부른다

let circle = {
  radius: 5,
  
  getDiameter: function (){
    return 2 * this.radius;
  }
};

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

💡 프로퍼티 접근

프로퍼티에 접근하는 방법은

  • 마침표 프로퍼티 접근 연산자를 사용하는 마침표 표기법
  • 대괄호 프로퍼티 접근 연산자를 사용하는 대괄호 표기법
let person = {
  name : 'Lee'
};

console.log(person.name);
console.log(person['name']);

📌 대괄호 프로퍼티 접근 연산자 내부에 지정하는 프로퍼티 키는 반드시 따옴표로 감싼 문자열이어야 한다.

let person = {
  'last-name' : 'Lee'
};

person.'last-name'; // SyntaxError
person.last-name; // NaN
person['last-name'];

📌 person.last를 먼저 평가해서 undefined-name으로 식별되기 때문에 NaN이 된다.


💡 프로퍼티 삭제

delete 연산자를 사용해 객체의 프로퍼티를 사용한다.

delete  person.age;

📌 존재하지 않는 프로퍼티를 삭제하면 아무 에러없이 무시된다.


💡 ES6에서 추가된 기능

프로퍼티 축약 표현

let x = 1, y = 2;

const obj = {x, y};

// obj = {x : 1, y : 2};

계산된 프로퍼티 이름

const prefix = 'prop';
let i = 0;

const obj = {
  [ `${prefix}-${++i}` ] : i,
  [ `${prefix}-${++i}` ] : i
};

// obj = {prop-1 : 1, prop-2 : 2}

메서드 축약표현

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

💡 원시 값과 객체

  • 원시 타입의 값, 즉 원시 값은 변경 불가능한 값이다. 이에 객체 타입의 값, 즉 객체는 변경 가능한 값이다.

  • 원시 값을 변수에 할당하면 변수에는 실제 값이 저장된다. 이에 비해 객체 타입의 값, 즉 객체를 할당하면 변수에는 참조값이 저장된다.

  • 원시 값을 갖는 변수를 다른 변수에 할당하면 원본의 원시 값이 복사되어 전달된다. 이를 값에 의한 전달이라 한다. 이에 비해 객체를 가리키는 변수를 다른 변수에 할당하면 원본의 참조 값이 복사되어 전달된다 이를 참조에 의한 전달이라 한다.

✅ 요약

우선 자바스크립트는 원시값을 제외한 값은 다 객체이다.

위 결과처럼 1, '1' 즉 숫자와 문자열은 객체가 아니라 원시값이다.
또한 함수는 그냥 함수이다.
그리고 리스트는 객체이다.

이처럼 원시값을 제외한 은 객체가 맞다.

값의 할당

숫자나 문자와 같은 원시값을 변수에 할당하게 되면 메모리에 그 이 저장된다.

그렇기 때문에 원시값이 할당된 변수의 값을 바꾸더라도 그 원시값 자체는 바뀌지 않는다.

객체를 변수에 할당하게 되면 메모리에 그 객체가 있는 주소의 값이 저장된다.

그렇기 때문에 객체가 할당된 변수의 값을 바꾸면 객체의 값도 함께 바뀐다. (얕은 복사가 되기 때문에)

따라서 객체를 변수에 할당을 하게 된다면 생각지 못한 값의 변화가 일어 날 수 있기 때문에 꼭 사용해야 한다면 lodash를 이용해서 깊은 복사를 해야 한다.

참고: https://www.inflearn.com/course/%EB%AA%A8%EB%8D%98-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%94%A5%EB%8B%A4%EC%9D%B4%EB%B8%8C

0개의 댓글