[TIL] DAY-7 JS 주요 문법
📖 모던 JavaScript Deep Dive
객체 리터럴
객체란
자바 스크립트는 객체 기반의 프로그래밍 언어이며 구성하는 거의 모든 것이 객체다.
원시 값을 제외한 나머지 값은 모두 객체
원시 타입의 값은 변경 불가능한 값( immutable value ), 객체 타입의 값은 변경 가능한 값( mutable value )이다.
객체는 0개 이상의 프로퍼티로 구성된 집합이고 키와 값으로 구성된다.
- 프로퍼티 : 객체의 상태를 나타내는 값
- 메서드 : 프로퍼티를 참조하고 조작할 수 있는 동작
객체 리터럴에 의한 객체 생성
C++나 자바 같은 클래스 기반 객체지향 언어는 클래스를 사전에 정의하고 필요한 시점에 new 연산자와 함께 생성자를 호출하여 인스턴스를 생성하는 방식으로 객체를 생성한다
인스턴스 : 클래스에 의해 생성되어 메모리에 저장된 실체를 뜻한다.
자바스크립트는 프로토타입 기반 객체 지향 언어로서 다양한 객체 생성방법을 지원한다.
-
객체 리터럴
-
Object 생성자 함수
-
생성자 함수
-
Object.create 메서드
-
클래스(ES6)
객체 리터럴은 중괄호내에 0개 이상의 프로퍼티를 정의한다. 변수에 할당되는 시점에 자바스크립트 엔진은 객체 리터럴을 해석해 객체를 생성한다.
var person = {
name: 'Lee',
sayHello: function () {
console.log('Hello! My name is ${this.name}.');
}
};
console.log(typeof person); //Object
console.log(person) // {name: "Lee", sayHello: f}
객체 리터럴의 중괄호는 코드 블록을 의미하지 않는다. 객체 리터럴은 값으로 평가되는 표현식이기 때문에 닫는 중괄호 뒤에는 세미콜론을 붙인다.
프로퍼티
객체는 프로퍼티의 집합이며, 프로퍼티는 키와 값으로 구성된다.
var person = {
//프로퍼티 키는 name,age 프로퍼티 값은 'Lee',20
name: 'Lee',
age: 20
};
프로퍼티를 나열할 때는 쉼표로 구분한다.
마지막 프로퍼티에는 쉼표를 사용하지 않으나 사용해도 좋다.
- 프로퍼티 키 : 빈 문자열을 포함하는 모든 문자열 또는 심벌 값
- 프로퍼티 값 : 자바스크립트에서 사용할 수 있는 모든 값
프로퍼티 키를 사용할 때 식별자 네이밍 규칙을 준수하자
메서드
프로퍼티 값이 함수일 경우 일반 함수와 구분하기 위해 메서드라 부른다. 즉, 메서드는 객체에 묶여 있는 함수를 의미한다.
var circle = {
radius: 5, //프로퍼티
getDiameter: function () { //메서드
return 2 * this.radius;
}
};
console.log(circle.getDiameter()); //10
프로퍼티 접근
프로퍼티에 접근하는 방법은 두 가지다.
- 마침표 표기법( dot notation )
- 대괄호 표기법( bracket notation )
var person = {
name: 'Lee'
};
// 마침표 표기법에 의한 프로퍼티 접근
console.log(person.name);
// 대괄호 표기법에 의한 프로퍼티 접근
console.log(person['name']);
대괄호 표기법을 사용하는 경우 접근 연산자 내부에 지정하는 프로퍼티 키는 반드시 따옴표로 감싼 문자열이어야 한다.
프로퍼티 값 갱신
이미 존재하는 프로퍼티에 값을 할당하면 프로퍼티 값이 갱신된다.
프로퍼티 동적 생성
존재하지 않는 프로퍼티에 값을 할당하면 프로퍼티가 동적으로 생성되어 추가되고 프로퍼티 값이 할당된다.
프로퍼티 삭제
delete 연산자는 객체의 프로퍼티를 삭제한다. 이때 delete 연산자의 피연산자는 프로퍼티 값에 접근할 수 있는 표현식이어야 한다.
프로퍼티를 삭제하면 아무런 에러 없이 무시된다.
ES6에서 추가된 객체 리터럴 확장 기능
- 프로퍼티 축약 표현
- 계산된 프로퍼티 이름
- 메서드 축약 표현
메서드 축약 표현으로 정의한 메서드는 할당한 함수와 다르게 동작한다
프로토타입이 비어있다 -> 생성자 함수를 쓸 수 없음
메서드 축약형이라기 보다 메서드의 선언 형태를 정확히 정의 했다라고도 생각해본다..(정확하지 않음)
원시 값과 객체의 비교
원시 타입의 값, 즉 원시 값은 변경 불가능한 값이다. 이에 비해 객체 타입의 값은 변경 가능한 값이다.
const 키워드를 사용해 선언한 변수는 재할당이 금지된다. 상수는 재할당이 금지된 변수일 뿐이다.
유사 배열 객체
유사 배열 객체란 마치 배열처럼 인덱스로 프로퍼티 값에 접근할 수 있고 length 프로퍼티를 갖는 객체를 말한다.
원시 값을 객체처럼 사용하면 원시 값을 감싸는 래퍼 객체로 자동 변환된다.
값에 의한 전달
var score = 80;
var copy = score;
console.log(score); // 80
console.log(copy); // 80
score = 100;
console.log(score); // 100
console.log(copy); // 80
변수에 원시 값을 갖는 변수를 할당하려면 할당받는 변수에는 할당되는 변수의 원시값이 복사되어 전달된다.
변수에는 값이 전달되는 것이 아니라 메모리 주소가 전달된다. 이는 변수와 같은 식별자는 값이 아니라 메모리 주소를 기억하고 있기 때문이다.
객체
자바스크립트 객체는 프로퍼티 키를 인덱스로 사용하는 해시테이블이라고 생각할 수도 있는데 대부분의 자바스크립트 엔진은 해시테이블과 유사하지만 일반적인 해시테이블보다 나은 방법으로 객체를 구현한다.
원시값은 변경 불가능한 값이므로 재할당 외에는 방법이 없다 하지만 객체는 재할당 없이 객체를 직접 변경할 수 있다. 재할당 없이 프로퍼티를 동적으로 추가할 수도 있고 프로퍼티 값을 갱신할 수도 있으며 프로퍼티 자체를 삭제할 수도 있다.
불변 객체: 일반적으로 한번 만든 객체는 건들지 않고 값을 바꾸려고 할때 새로운 객체를 만든다.
Object.freeze()로 하는 것도 있는데 아직 잘 모르겠다.
얕은 복사와 깊은 복사
얕은 복사(1단계만 복사) <-> 깊은 복사(재귀적으로 원시 값까지 전부 복사)
참조에 의한 전달
객체를 가리키는 변수를 다른 변수에 할당하면 원본 참조 값이 복사되어 전달되는 것을 의미한다.
var person = {
name: 'Lee'
};
// 참조 값을 복사
var copy = person;
// copy와 person은 동일한 객체를 참조
console.log(copy === person);
//copy를 통해 객체를 변경
copy.name = 'Kim';
//person을 통해 객체를 변경
person.address = 'Seoul';
console.log(person); // {name: "Kim", address: "Seoul"}
console.log(copy); // {name: "Kim", address: "Seoul"}
값에 의한 전달 과 참조에 의한 전달 은 식별자가 기억하는 메모리 공간에 저장되어 있는 값을 복사해서 전달한다는 면에서 동일하다.
회고🥲
사실 오늘 모던 자바스크립트 외에 알고리즘 공부를 좀 더 하려고 했는데 내 코드리뷰를 받고 다른 사람의 코드 분석을 하고 코드리뷰에 대해 어떻게 하는게 좋을지 찾아보고 고민하다 시간을 많이 썼다...다른 사람 코드를 분석해본적이 많이 없어서 시간이 꽤 오래 걸리고 나보다 다 잘 구현하셔서 내 방식과 다른 부분을 어떤 의도로 구현을 했는지에 대해 생각해보며 코드 분석을 진행하였다. 그리고 모던 자바스크립트는 역시 재밌다..! 곧 함수형 프로그래밍도 들어갈텐데 걱정이 많이 되지만 화이팅😁
참고
모던 JavaScirpt Deep Dive
Author And Source
이 문제에 관하여([TIL] DAY-7 JS 주요 문법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@dnrxorla/TIL-DAY-7-JS저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)