라벨이 es6+인 게시물 표시

[JavaScript] Module CommonJS, ES6 모듈 시스템

Module CommonJS, ES6 모듈 시스템 모듈이란 애플리케이션을 구성하는 개별적인 요소로서 재사용 가능한 코드 조각(부품)을 말한다. 일반적으로 모듈은 파일 단위로 분리되어 있으며 애플리케이션은 필요에 따라 명시적으로 모듈을 로드하여 재사용한다.  즉, 모듈은 애플리케이션에 분리되어 개별적으로 존재하다가 애플리케이션의 로드에 의해 비로소 애플리케이션의 일원이 된다.  모듈은 기능별로 분리되어 작성되므로 코드의 단위를 명확히 분리하여 애플리케이션을 구성할 수 있으며 재사용성이 좋아서 개발 효율성과 유지보수성을 높일 수 있다. 브라우저 환경에서의 모듈 시스템 브라우저 환경에서 자바스크립트는 script 태그를 사용하여 외부의 스크립트 파일을 가져와 사용할 수 있지만, 파일마다 독립적인 파일 스코프를 갖지 않고 하나의 전역 객체(Global Object)를 공유하게 된다. 그러므로 자바스크립트 파일을 여러 개의 파일로 분리하여 script 태그로 로드하여도 분리된 자바스크립트 파일들이 결국 하나의 자바스크립트 파일 내에 있는 것처럼 하나의 전역 객체를 공유한다.  따라서 분리된 자바스크립트 파일들이 하나의 전역을 갖게 되어 전역 변수가 중복되는 등의 문제가 발생할 수 있다.  이러한 문제점을 해결하기 위해서 script 태그에 type="module" 어트리뷰트를 추가하면 로드된 자바스크립트 파일은 모듈로서 동작하게 할 수 있긴하다. 브라우저 환경에서의 모듈 시스템을 간단히 알아보았고 본격적으로 CommonJS와 ES6 모듈 시스템에 대해서 알아보자! CommonJS ( require / exports / module.exports ) 최근 많은 프로젝트에서는 ES6 모듈 시스템을 많이 사용하지만 기존의 프로젝트들 중 CommonJS 모듈 시스템으로 작성된 코드들도 있으며 특히 Node.js에서는 CommonJS 모듈 시스템을 기본적으로 채택하고 있어 알아둘 필요가 있다. CommonJS 모듈 시스템...

[JavaScript] spread operator(전개연산자)

배열에서의 전개연산자 // 기본동작원리코드 const fruits1 = [ "apple" , "orange" , "banana" ]; const fruits2 = [... fruits1 ]; console . log ( fruits1 ); // [ 'apple', 'orange', 'banana' ] console . log ( fruits2 ); // [ 'apple', 'orange', 'banana' ] console . log ( fruits1 === fruits2 ); //false (fruit1 === fruit2); //false 결과가 나온 이유는 immutable array와 같은 개념으로 참조가아닌 원본객체 복사하여 새로운 fruit 객체를 만든것이기 때문이다. 직접 확인해보면 아래와 같다. const fruits1 = [ "apple" , "orange" , "banana" ]; const fruits2 = [... fruits1 ]; // console.log(fruits1); // [ 'apple', 'orange', 'banana' ] // console.log(fruits2); // [ 'apple', 'orange', 'banana' ] // console.log(fruits1 === fruits2); //false fruits1 . push ( "watermelon" ); console . log ( fruits1 ); // [ 'apple', 'orange', 'banana', 'watermelon' ] console . log ( fruits2 ); // [ ...

Arrow function(화살표 함수)과 매개변수의 기본값 설정

arrow function(화살표 함수) 표현방식 // 1번) // 한 줄 작성 let arrow1 = ( x , y ) => x + y ; arrow ( 10 , 10 ) //20 // 여러줄 작성 let arrow2 = ( x , y ) => { console . log ( "여러줄 작성" ); return x + y ; } arrow2 ( 10 , 10 ) //20 // 여러 줄 작성 (return문 미작성) let arrow2 = ( x , y ) => { console . log ( "여러줄 작성" ); x + y ; } arrow2 ( 10 , 10 ) //undefined 한줄로 코드를 작성할 경우 { }중괄호 생략이 가능하다. 하지만 여러 줄의 코드를 작성해야 하는경우 { }중괄호와 return문이 꼭 작성되어야한다. return문이 없는 경우 undefined를 반환한다. // 2번) const oneParameter = x => x ; oneParameter ( 10 ) // 10 매개변수가 하나일 경우 괄호도 생략이 가능하다. 매개변수가 두개인 경우에는 생략 불가 // 3번) const obj = ( x , y ) => ({ x , y }) obj ( 123 , 456 ); // {x: 123, y: 456} 하지만 객체를 반환하는 경우에는 ( ) 소괄호를 사용해야 한다. 매개변수에 기본값 설정 화살표 함수를 포함한 함수 선언문방식과 함수 표현식에서 모두 매개변수에 기본값을 설정할 수 있다. 매개변수에 할당연산자를 이용하여 매개변수에 값이 전달되지 않은 경우 해당 기본값으로 계산되게 할 수 있다. // ex1) let arrow = ( x = 1 , y = 2 ) => { return x + y ; } arrow (); // 결과 : 3 // ex2) let arrow = ( x , y...

[JavaScript] immutable array

이미지
객체의 경우 값의 메모리 주소를 참조하기 때문에 객체에 특정한 값을 추가하거나 삭제 할 경우 원본 데이터가 변경되는 일이 발생한다. 객체를 변경하지 않고 원본 상태를 유지하면서 기존의 데이터를 그대로 갖고있으면서 새로운 값을 추가한 새로운 객체를 생성할 수 있다. list 배열 객체 원본 데이터는 변경하지 않으면서 mango를 추가한 새로은 list2 배열을 만들었다. list 배열과 list2 배열을 비교연산자로 비교해보면 false값을 반환한다. 즉, 기존의 list 배열을 참조하지않고 복제한것이다. concat 메서드를 이용해서도 가능하고 Array.from() aptjemfheh immutable array를 생성할 수 있다. 객체의 경우 Object.assign()을 사용하여 불변 객체를 생성할 수 있다. 이외에도 전개연산자를 사용하거나 immer 라는 라이브러리를 사용하여 불변 객체를 생성할 수 있다. 리액트를 공부하면서 불변성에 대해서 공부해 보았다. 

[JavaScript] const, let, var 차이점 + 호이스팅(Hoisting)

첫번째 차이점 - 접근 범위 var는 function level scope 즉, 함수 단위 범위를 가진다. let 과 const는 block level scope 즉, 중괄호{ } 단위 범위를 가진다. function level scope란   선언된 함수의 { } 중괄호 안에서 작성된 변수와 함수는 함수 블록 내부에서만 참조가 가능하다. 선언된 함수 블록을 제외한 if 조건문, for 와 같은 반복문 등의 블록 내부에서 선언된 변수 또는 함수는 전역변수이면서 전역함수이다. function person () { var name1 = "lee" ; let name2 = "kim" ; } console . log ( name1 ); // ReferenceError: name1 is not defined => var는 함수 레벨 스코프 이므로 접근 불가 console . log ( name2 ); // ReferenceError: name2 is not defined => let은 블록레벨 스코프 이므로 접근 불가 { var fruit = "apple" ; console . log ( fruit ); // apple } console . log ( fruit ); // apple => 함수 레벨 스코프이므로 var로 선언한 변수는 전역변수가 된다. if ( true ) { var name1 = "lee" ; let name2 = "kim" ; } console . log ( name1 ); // lee => var는 함수 레벨 스코프이므로 참조가능(전역변수) console . log ( name2 ); // ReferenceError: name2 is not defined => let은 블록레벨 스코프 이므로 접근 불가 function level scope 는 함수의 코드 블록만을 스코프로 인정한다. 함수 외...