본문 바로가기

JavaScript

[Javascript] ES6 ~ ES11 정리

반응형

var, let, const

var : 재정의와 재선언 가능. 함수 레벨 스코프. 함수 내에 선언된 변수는 해당 함수 내에서만 유효. 함수 외부에서 선언한 변수는 모두 전역 변수.

let : 가변변수, 재정의 가능, 재선언 불가능. 블록 레벨 스코프
변수의 호이스팅을 방지

const : 불변변수, 재정의와 재선언이 불가능하므로 선언과 동시에 정의해야함. 블록 레벨 스코프. 객체의 경우 할당된 주소값이 변경되는게 아니기 때문에 내용 변경이 가능. 객체(함수)나 배열 타입은 const 사용 추천. (함수는 객체 취급하기 때문에 함수 변수에 속성 추가가 가능함)
객체는 const


기존 var 의 문제점으로 인해 let과 const 키워드를 사용하는 것을 권장
1. var의 경우 유연한 사용이 가능하기 때문에 예기치 못한 값 반환
2. 함수 레벨 스코프로 인해 함수 외부에서 선언한 변수는 전역변수로 사용
3. 변수 선언문 이전에 변수 참조시 오류가 아닌 undefined 반환 (호이스팅 발생)

 

참고 URL

 

var, let, const 제대로 알기

var는 함수 레벨 스코프(Function-level scope) 함수 내에서 선언된 변수는 함수 내에서만 유효하며 함수 외부에서는 참조할 수 없다. 즉, 함수 내부에서 선언한 변수는 지역 변수이며 함수 외부에서 선

jaddong.tistory.com

 

더보기

호이스팅

var 변수나 function 함수 선언이 해당 스코프의 맨 위에서 동작하는 특성

 

호이스팅 - MDN Web Docs 용어 사전: 웹 용어 정의 | MDN

JavaScript 호이스팅은 인터프리터가 코드를 실행하기 전에 함수, 변수, 클래스 또는 임포트(import)의 선언문을 해당 범위의 맨 위로 끌어올리는 것처럼 보이는 현상을 뜻합니다.

developer.mozilla.org

 

1. 함수의 호이스팅 (var와 상관없이 함수 선언식 사용 시 발생)

add1(1,1);	// 오류나지 않음
add2(1,1);	// 오류남

// 함수 선언식
function add1(x, y) {
  return x + y;
}

// 함수 표현식
const add2 = function(x, y) {
  return x + y;
};

 

2. 변수의 호이스팅 (var 사용 시)

var 키워드로 선언된 변수는 선언 단계와 동시에 undefined로 초기화됨 >> 참조가 가능함

var num = 100;	// 전역변수

function print() {
	console.log(num);	// undefined 출력됨
	var num = 23;		// 지역변수
	console.log(num);
}

 

↑위 코드가 ↓아래와 같이 변경되어 처리되기 때문에 undefined 출력이 되버림

 

function print() {
	var num;
	console.log(num);	// undefined 출력됨
	num = 23;
	console.log(num);
}

 

let이나 const로 정의하여 호이스팅을 방지함.

 

console.log(a); // undefined
var a = 1;

console.log(b); // 오류남! b is not defined
let b;

 

참고 URL

 

📚 호이스팅(Hoisting) 발생 원리를 알아보자

자바스크립트 호이스팅(Hoisting) 자바스크립트에서 호이스팅(Hoisting)은 변수 선언과 함수 선언을 코드의 맨 위로 끌어올려지는 현상을 일컫는다. 그래서 개발자가 어느 라인 위치에 코드를 선언

inpa.tistory.com

화살표 함수 Arrow function (ES6~)

let a = 1;
let b = 2;

// 기본 함수 형식
let sum = function(a, b) {
  return a + b;
};

// 화살표 함수 형식
let sum1 = (a, b) => {
  return a + b;
};
let sum2 = (a, b) => a + b; // { 다음에 return이 바로 올 경우 생략 가능
let sum2 = (a, b) => (a + b); // ()로 묶을 수 있음

let num1 = a => a + 2;	// 인수가 하나인 경우 괄호 생략 가능
let print = () => alert("인수가 없음");	// 인수가 없을 경우 괄호만, 생략 불가

let num2 = (num1 % 2 == 0) ? () => alert('짝수') : () => alert('홀수');	// 삼항연산자로 함수 사용 가능

export/import (ES6~)

// named export 기본 형식
export { 모듈명1, 모듈명2 };
import { 모듈명1, 모듈명2 } from 'js 파일 경로';

// default export 기본 형식
export default 모듈명;
import 모듈명 from 'js 파일 경로';

Shorthand property names (ES6~)

// 객체 초기자
const name = "홍길동";
const id = "hong20";
const age = 20;

const object = {
	name : name,
	id : id,
	age : age,
}

// 변수명이 동일할 때 생략 가능
const object2 = {
	name,
	id,
	age,
}

Destructuring assignment (ES6~)

// 객체
const obj = {
	name : "홍길동",
	id : "hong20",
	age : 20,
}

// 기존 변수 정의
const name = obj.name;
const id = obj.id;
const age = obj.age;

// 축약 가능
const {name, id, age} = obj;	// 변수명과 동일한 속성의 값을 저장

 

// 배열
const fruit = ['사과', '귤', '수박']

// 기존 변수 정의
const fir = obj[0];
const sec = obj[1];

// 축약 가능
const {fir, sec} = fruit;	// 순서대로 변수에 값이 들어감

Spread syntax (ES6~)

const obj1 = {fruit:'수박'};
const obj2 = {fruit:'딸기'};
const arr = [obj1, obj2];

// array copy
const arrCopy = [...arr];	// 배열 복사
/* 주소를 참조했기 때문에 arr을 수정하면 arrCopy에도 영항이 갈 수 있음 */
const arrCopy2 = [...arr, {fruit:'포도'}];	// 값을 추가해서 배열 복사
const fruits = [...arrCopy, arrCopy2];		// 배열 합치기

// object copy
const obj3 = {...obj2};
const obj4 = {...obj2, color:'red'};	// 값을 추가해서 객체 복사
const obj5 = {...obj1, ...obj2};	// 객체 합치기
/* key가 동일한 경우 마지막 값이 덮어씌어짐 */

Default parameters (ES6~)

function setValue(value) {
	if(value == null || value == '') {	// 값이 없을 경우
    	// default 값 설정
        value = 0;
    }
	console.log(value);
}
setValue();	// 0 출력


// 인자가 전달되지 않을 경우 기본값 설정됨
function setDefaultValue(value = 0) {
	console.log(value);
}
setDefaultValue();	// 0 출력

Template Literals (ES6~)

const name = '홍길동';
const age = 20;

console.log('제 이름은 ' + name + '입니다.\n 저는 ' + age + '살 입니다.');
console.log(`제 이름은 ${name}입니다.\n 저는 ${age}살 입니다.`);	// 주의! ` 백틱으로 묶을 것

옵셔널 체이닝 Optional chaining (ES11~)

// 없는 속성 접근할 경우
const obj = {
	name : '홍길동',
	userInfo : {
		birth : '20000101',
		nationality : 'Korea',
		subject : {
			//first : '국어',
			second : '영어',
		}
	}
}

// 값이 있는지 확인
console.log(obj.userInfo && obj.userInfo.subject && obj.userInfo.subject.first);
console.log(obj.userInfo ? .subject ? .first );		// 간소화 가능

널 병합 연산자 Nullish Coalescing Operator (ES11~)

// 기존
const userName = name || '홍길동';
/* &&, || 연산자의 false 판정 >> false, '', 0, null, undefined 전부 false */

const name = '';
const userName = name ?? '홍길동';		// name 값이 있다면 name, 값이 없다면 '홍길동'

고차 함수 Higher order function

함수를 인자로 받거나, 함수를 return 하는 함수.

Array.prototype.map, Array.prototype.filter, Array.prototype.reduce 등 언어 내부에 포함된 (built-in) 고차함수도 있다.

 

const num = 21;

function odd() {
    return '짝수';
}
function even() {
    return '홀수';
}

// ES5~ 방식
function number1(num, fn1, fn2) {
    let typeStr = '';
    if(num % 2 == 0) {		// 홀수
        return fn1();
    }
    else if(num % 2 == 1) {	// 짝수
        return fn2();
    }
}

// 함수를 인자로 넘기며 함수를 return 받는다.
console.log(num + '은 ' + number1(num, odd, even) + '입니다.');	


// ES6~ 방식
const number2 = (num, fn1, fn2) => {
    let typeStr = '';
    if(num % 2 == 0) {		// 홀수
        return fn1();
    }
    else if(num % 2 == 1) {	// 짝수
        return fn2();
    }
}

// 함수를 인자로 넘기며 함수를 return 받는다.
console.log(`${num}은 ${number2(num, odd, even)}입니다.`);

 

 

 

 

Array.prototype.map 예제

> map() 메소드는 배열 내 모든 엘리먼트를 인자로 제공받는 콜백 함수를 호출 => 새로운 배열 생성

 

> 만들어본 예제 : 구구단 출력하기

// 2단 출력하기 (ES5 방식)
const num = 2;
const arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const arr2 = [];

for(let i=0; i < arr1.length; i++) {
	arr2.push(arr1[i] * 2);
}

for(let j=0; j < arr2.length; j++) {
	console.log(num + " * " + arr1[j] + " = " + arr2[j]);
}

 

>> 변경 순서

 

// 2단 출력하기 (ES6~ 고차함수 활용 방식)
const num = 2;
const arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const arr2 = [];

// 1. 함수 선언식으로 작성 (기존)
for(let i=0; i < arr1.length; i++) {
	arr2.push(arr1[i] * 2);
}

// 2. 함수 표현식으로 변경
const arr3 = arr1.map(function(item){ // index와 array는 사용하지 않으니 생략
	return num * item;
});

// 3. 화살표 함수로 변경
const arr4 = arr1.map((item) => (num * item));

// + 참고. 인자가 하나일 경우 괄호 생략 가능, return ()로 안묶어도 됨.
const arr5 = arr1.map(item => num * item);


// 결과 출력
for(let j=0; j < arr2.length; j++) {
	console.log(`${num} * ${arr1[j]} = ${arr5[j]}`);
}

 


삼항 연산자로 return 값을 분기처리 할 수도 있다.

 

const arr1 = [1, 6, 13, 15, 26, 54];

// 응용
const arr6 = arr1.map((item) => item % 2 == 0 ? '짝수' : '홀수');  // 홀짝
console.log("arr6 : ",arr6);

 

 

 


Array.prototype. filter 예제

> filter() 메소드는 배열 내 모든 엘리먼트를 인자로 제공받는 콜백 함수 => 테스트를 통과한 엘리먼트로 새로운 배열 생성

 

 

> 만들어본 예제 : 짝수 찾기

const arr1 = [1, 6, 13, 15, 26, 54];

// ES5 방식 (기존)
const arr2 = [];
for(let i=0; i < arr1.length; i++) {
	if(arr1[i] % 2 == 0) {  // 짝수만
		arr2.push(arr1[i]);
    }
}
console.log("arr2 : ",arr2);


// ES6~ 방식
const arr3 = arr1.filter((item) => item % 2 == 0);  // 짝수만
console.log("arr3 : ",arr3);

 

 

 

Array.prototype.reduce 예제

> reduce () 메소드는 배열 내 모든 엘리먼트를 인자로 제공받는 콜백 함수 => 하나의 결과 값(집계한 값)을 생성해 반환

 

> 만들어본 예제 : 배열 전체 합 구하기

 

const arr = [1, 2, 3, 4, 5];

// 1. for문 활용 (기존 ES5 방식)
let total1 = 0;
for(let i=0; i<arr.length; i++) {
    total1 += arr[i];
}
console.log("total1 : ",total1);


// 2. 함수를 따로 빼는 방식
//function sum(total, num) {
//    return total + num;
//}
const sum = (total, num) => {
	return total + num;
}
const total2 = arr.reduce(sum);   // 배열 내 모든 값의 합계
console.log("total2 : ",total2);


// 3. 함수를 인자로 넘기는 방식
const total3 = arr.reduce((total, num) => {
    return total + num;
});   // 배열 내 모든 값의 합계
console.log("total3 : ",total3);


// 4. 화살표 함수 방식
const total4 = arr.reduce((total, num) => total + num);
console.log("total4 : ",total4);

 

 

 

Array.prototype.forEach 예제

> forEach() 메소드는 배열 내 모든 엘리먼트를 인자로 제공받는 콜백 함수 => 하나의 결과 값(집계한 값)을 생성해 반환

 

const arr = [1, 2, 3, 4, 5];

arr.forEach(function(num) {
    console.log(num);
}); // 출력: 1 2 3 4 5

 


> 만들어본 예제 : 객체 순회 활용

 

const user = {
	name: '홍길동',
    id : 'hong123',
	age: 20,
};


// Object.keys(user) >> 객체의 키 값을 배열로 추출
console.log('1. ES5~');
Object.keys(user).forEach(function(key) {
	console.log(key + ': ' + user[key]);
});


console.log('\n2. ES6~');
Object.keys(user).forEach((key) => {
    user[key] = user[key] + 1;  // 값 수정
});
console.log('수정한 user : ',user);

 

 

 

반응형

'JavaScript' 카테고리의 다른 글

IIFE - 즉시 호출 함수 표현식  (0) 2022.01.25