실습 문제를 풀다가 콘솔을 찍어보니 new Date()에서의 현재 날짜의 월과 해당 값에서 월만 추출하는 getMonths()의 값이 달랐다.let date = new Date(); let month = date.getMonth() + 1; console.log('DATE', date); console.log('MONTH', month); let season = '봄'; if (3 getMonths() 값은 현재 월(月)보다 -1인 값이 나오는 현상을 발견했다🤔 찾아보니 JS가 열흘만에 급하게 만든 언어인지라 날짜 표기를 Java JDK1.0(1995) 버전을 카피해오면서 해당 버전에서 채택하는 zero-base를 따르게 된 것이었다. 그래서 특이하게 g..
자바스크립트
프로토타입이란?자바스크립트의 모든 객체는 자신의 부모 역할을 하는 객체와 연결되어있고 이 부모 객체를 프로토타입이라고 한다.모든 객체는 자신의 "원형(Prototype)" 이 되는 객체를 가지며 이를 프로토타입이라고 한다. 그리고 모든 프로토타입은 생성자 함수와 연결되어 있다.객체의 프로토타입은 생성 방식에 따라 달라진다.객체 리터럴 생성 ⇒ Object.prototype생성자 함수로 생성 ⇒ 생성자 함수의 prototype 프로퍼티에 바인딩된 객체프로토타입 효과메모리 효율성Javascript에서 모든 객체는 프로토타입을 공유한다. 객체 자체가 스스로 메소드와 속성을 모두 가지는 대신 여러 객체가 동일한 프로토타입을 공유하도록하고 이를 사용하면 메모리를 효율적으로 사용할 수 있다.객체지향스러움프로토타입 ..
모듈이란여러 기능에 관련된 코드가 모여 있는 하나의 파일모듈의 장점유지보수성네임 스페이스화재사용성JS에서의 모듈 개발을 위한 시도들 : CommonJS, UMD, ES6 등CommonJSJS 공식 스펙에서 브라우저만 지원했었기에 SSR/데스크탑에서 지원하려는 노력이 CommonJS라는 그룹이었다. 여기에서는 JS가 범용 언어로 쓰였기 때문에 모듈화가 필요했다.다른 모듈을 사용할 때는 require, 모듈을 스코프 밖으로 보낼 때는 module.exports를 사용하며 Node.js에서는 현재 이 방식을 쓴다.exports vs module.exportsexports도 사용 가능하지만 차이가 있다. module.exports를 참조하기에 직접 module.exports 값을 바꾸지 않고 객체 멤버를 생성하..
일급 객체의 조건무명의 리터럴로 생성 가능. 런타임에 생성 가능변수나 자료구조(객체, 배열 등)에 저장 가능함수의 매개변수에 전달 가능함수의 반환값으로 사용 가능⇒ 자바스크립트의 함수는 일급 객체이다. 즉, 객체와 동일하게 사용 가능하며 값과 동일 취급이 가능하다. 특히 매개변수, 반환값으로 사용 가능하다는 점은 함수형 프로그래밍을 가능하게 하는 JS의 장점이다.함수와 일반 객체의 차이점함수는 호출 가능하다함수는 함수 고유의 프로퍼티를 가진다arguments 프로퍼티caller 프로퍼티length 프로퍼티name 프로퍼티prototype 프로퍼티위의 프로퍼티들은 함수 객체의 데이터 프로퍼티. 하지만 아래의 접근자 프로퍼티는 Object.prototype을 상속받은 프로퍼티이다.proto 접근자 프로퍼티함..
함수를 일급 객체로 취급하는 함수형 프로그래밍 언어에서 사용되는 개념이다.“함수와 그 함수가 선언된 렉시컬 환경과의 조합” -MDN외부 함수보다 중첩 함수가 더 오래 유지될 때, 중첩 함수는 생명 주기가 종료된 외부 함수 변수를 여전히 참조할 수 있는데, 이런 중첩 함수를 클로저라고 한다.렉시컬 스코프이전에 다뤘듯이, 렉시컬 스코프란 정적 스코프라고도 하며, 함수 정의가 평가되는 시점에 함수가 호출된 위치가 아니라 함수가 정의된 위치에 따라 상위 스코프가 정적으로 결정된다.스코프의 실체는 실행 컨텍스트의 렉시컬 환경이고, 이 렉시컬 환경은 외부 렉시컬 환경에 대한 참조로 상위 렉시컬 환경과 연결되는 스코프 체인을 가진다.클로저의 원리함수 객체의 내부 슬롯 [[Environment]]함수가 정의된 환경과 ..
소스코드의 종류소스코드의 타입에 따라 실행 컨텍스트를 생성하는 과정과 내용이 다르다.전역 코드전역 변수 및 전역 함수를 전역 객체와 연결함수 코드지역 스코프를 전역 스코프 체인의 일원으로 연결eval 코드strict mode에서 독자적인 스코프 생성모듈 코드모듈별 독립적인 모듈 스코프 생성실행 컨텍스트란코드의 실행환경에 대한 여러가지 정보를 담고 있는 개념으로, 간단히 말하자면 자바스크립트 엔진에 의해 만들어지고 사용되는 코드 정보를 담은 객체의 집합이라고 할 수 있다.실행 컨텍스트의 역할JS 엔진의 소스코드 실행 과정전역 코드 평가(전역 실행 컨텍스트 생성)전역 코드 실행함수 호출되면 함수 코드 평가(함수 실행 컨텍스트 생성)함수 코드 실행소스코드를 평가하고(이때 선언문만 먼저 실행) 실행 컨텍스트를 ..
this의 필요성객체에서 메서드가 쓰이기 위해서는 자신이 속한 객체를 가리키는 식별자를 참조할 수 있어야 한다.객체 리터럴로 쓰이면 재귀적으로 참조가 가능하긴 하다.const circle = {radius : 5,getDiameter(){ return 2 * circle.radius; }};console.log(circle.getDiameter()); // 10이게 가능한 이유는 객체 리터럴은 변수에 할당되기 직전, 미리 평가되기 때문에 circle을 참조할 수 있는 것이다.하지만 재귀적으로 참조하는 것을 일반적이지 않고 바람직하지 않은데, 다른 경우들에는 문제가 생길 수 있기 때문이다. 예를 들어 생성자 함수 방식으로 인스턴스를 생성한다고 생각해보자.function Circle(radius){ ???...
스코프식별자의 유효범위모든 식별자(변수 이름, 함수 이름, 클래스 이름 등)는 선언 위치에 따라 다른 코드가 본인을 참조할 수 있는 유효 범위가 결정된다.JS 엔진은 렉시컬 환경(코드가 실행되는 위치나 환경)을 고려해 코드를 실행한다. ⇒ 이를 구현한 것이 실행 컨텍스트!var 키워드로 선언된 변수는 같은 스코프 내 중복 선언이 허용된다 → 변수값이 재할당되어 변경되는 부작용이 생긴다.스코프 종류변수가 선언된 위치로 구분된다.전역 스코프코드 가장 바깥에 선언어디서든 참조 가능지역 스코프함수 내부에서 선언선언된 위치와 하위 지역 스코프에서 유효하다.스코프 체인함수가 중첩될 수 있기 때문에 지역 스코프 중첩도 가능하다. 즉, 함수 중첩에 의해 스코프 또한 계층적 구조를 가질 수 있다.이렇듯 스코프가 계층적으..
함수란수학에서의 함수와 마찬가지로 프로그래밍 언어에서의 함수는 입력을 받고 출력을 내보내는 일련의 과정을 하나의 실행 단위로 정의한 것을 말한다.함수의 구성 요소매개 변수 : 함수 내부로 입력을 전달받는 변수입력 : 인수출력 : 반환값함수 정의함수를 생성하는 것함수 호출 전 전달받을 매개변수, 실행할 문, 반환값을 지정한다.함수가 정의되면 JS엔진에 의해 평가되어 함수 객체가 된다.함수 정의 방법함수 선언문함수 이름생략 불가function add(x,y){ return x + y; }함수 표현식var add = function (x,y){ return x + y; };Function 생성자 함수var add = new Function('x', 'y', 'return x + y');화살표 함수(ES6)va..
객체자바스크립트는 객체 기반 프로그래밍 언어이다.원시타입과는 다르게 다양한 타입의 값들을 하나의 단위로 구성한 복합적인 자료구조이다!객체는 변경 가능한 값이다!0개 이상의 프로퍼티(는 키-값으로 구성)로 구성된 집합이다.프로퍼티 값이 함수면 일반함수와 구분하기 위해 메서드(method)라고 부름.💡 프로퍼티 : 객체 상태를 나타내는 값(data) 메서드 : 프로퍼티를 참조하고 조작할 수 있는 동작상태와 동작을 하나의 단위로 구조화할 수 있어서 유용하다.JS에서는 객체와 함수는 밀접하다. 함수로 객체를 생성하기도 하고 함수 자체가 객체이기 때문이다.리터럴 Literal리터럴이란 사람이 이해할 수 있는 문자 또는 약속된 기호를 사용해 값을 생성하는 표기법(notation)을 의미한다.쉽게 말해 사람이 이해..