1. block scope
기존의 함수에 의한 스코프처럼 { }
으로 감싼 내부에 별도의 스코프가 생성된다.
Copy {
let a = 10 ;
{
let a = 20 ;
console .log (a); // (1)
}
console .log (a); // (2)
}
console .log (a); // (3)
Copy let sum = 0 ;
for ( let j = 1 ; j <= 10 ; j ++ ) {
sum += j;
}
console .log (sum); // (1)
console .log (j); // (2)
Copy if ( Math .random () < 0.5 ) {
let j = 0 ;
console .log (j); // (1)
} else {
let j = 1 ;
console .log (j); // (2)
}
console .log (j); // (3)
2. block scoped variables
let
은 기존의 var
를 대체하는 블락변수이고, const
는 그 중 한 번 선언 및 정의되고 나면 값을 변경할 수 없는 변수이다. 블락 스코프 내부에서 선언된 let
, const
는 해당 스코프 내에서만 존재하며, 이들에 대해서는 'TDZ'가 존재한다.
TDZ (temporal dead zone, 임시사각지대)
: 블락 스코프 내에서는 지역변수/상수에 대한 호이스팅이 이뤄지기는 하나, 선언된 위치 이전까지는 해당 변수/상수를 인식하지 못한다.
Copy console .log (a); // (1)
let a = 2 ;
console .log (a); // (2)
Copy for ( let j = 0 ; j < 5 ; j ++ ) {
console .log (j);
}
console .log (j); // (1)
Copy const PI = 3.141593 ;
PI = 3.14 ; // (1)
3. arrow function
순수 함수로서의 기능만을 담당하기 위해 간소화한 함수. =>
의 좌측엔 매개변수, 우측엔 return될 내용을 기입한다. 우측이 여러줄로 이루어져있다면 { }
로 묶을 수 있으며, 이 경우엔 명시적으로 return을 기술하지 않으면 undefined
가 반환된다.
Copy let getDate = () => new Date ();
let sum = (a , b) => a + b;
let getSquare = a => {
return a * a;
};
let calc = (method , a , b) => {
switch (method) {
case "sum" :
return a + b;
case "sub" :
return a - b;
case "mul" :
return a * b;
case "div" :
return a / b;
}
return null ;
};
console .log ( getDate ());
console .log ( sum ( 4 , 5 ));
console .log ( getSquare ( 10 ));
console .log ( calc ( "mul" , 3 , 4 ));
Copy const obj = {
grades : [ 80 , 90 , 100 ] ,
getTotal : function () {
this .total = 0 ;
this . grades .forEach (v => {
this .total += v;
});
}
};
obj .getTotal ();
console .log ( obj .total); // (1)
4. rest parameter
함수 파라미터에 일정하지 않은 값들을 넘기고자 할 경우에 유용.
Copy function f (x , y , ... rest) {
console .log (rest); // (1)
}
f ( 1 , 2 , true , null , undefined , 10 );
Copy const sum = function ( ... arg) {
let result = 0 ;
for ( let i = 0 ; i < arg . length ; i ++ ) {
result += arg[i];
}
return result;
};
/* const sum = (...arg) => arg.reduce((p,c)=> p+c); */
console .log ( sum ( 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 )); // (1)
5. spread operator
문자열의 각 단어, 배열의 요소들이나 객체의 프로퍼티들을 해체하여 여러개의 값으로 반환해준다.
Copy const str = "hello olaf" ;
const arr = [ 20 , 10 , 30 , 40 , 50 ];
console .log ( ... arr); // (1)
console .log ([ ... str]); // (2)
Copy const originalArray = [ 1 , 2 ];
const copiedArray = [ ... originalArray];
originalArray .push ( 3 );
console .log (originalArray); // (1)
console .log (copiedArray); // (2)
6. default parameter
파라미터에 값을 할당하지 않거나 빈 값인 상태로 함수를 호출할 경우, 해당 파라미터를 지정한 기본값으로 인식하도록 해줌. 각 파라미터는 내부에서 let과 동일하게 동작하며, 따라서 TDZ가 존재한다.
Copy function f (x = 1 , y = 2 , z = 3 ) {
console .log (x , y , z); //(1)
}
f ( 4 , undefined , 5 );
Copy function multiply (x = y * 3 , y) {
console .log (x * y);
}
multiply ( 2 , 3 ); // (1)
multiply ( undefined , 2 ); // (2)
7. Enhanced Object Literal
7-1. property Shorthand
프로퍼티의 키와 값에 할당한 변수명이 동일한 경우, 키를 생략할 수 있다.
Copy const x = 10 ,
y = 20 ;
const obj = {
x ,
y
};
console .log (obj); // (1)
Copy function setInformation (name , age , gender) {
return {
name ,
age ,
gender
};
}
const person = setInformation ( "나연" , 23 , "female" );
console .log (person); // (1)
7-2. method Shorthand
메서드명 뒤의 : function
키워드를 생략할 수 있게 되었다.
Copy const obj = {
name : "olaf" ,
getName () {
return this .name;
} ,
printName (name) {
console .log ( this .getName ());
}
};
console .log ( obj .getName ()); // (1)
obj .printName (); // (2)
7-3. Object.assign
(ES6)
Object.assign() 객체의 복사를 수행한다.
Copy const originalObj = {
a : 1 ,
b : [ 2 , 3 , 4 ] ,
c : { d : 5 , e : 6 }
};
const copiedObj = Object .assign ({} , originalObj);
copiedObj .a = 11 ;
copiedObj .b[ 0 ] = 12 ;
copiedObj . c .d = 13 ;
console .log (originalObj , copiedObj); // (1)
Copy const originalObj = {
a : [ 2 , 3 , 4 ] ,
b : { d : 5 , e : 6 }
};
const copiedObj = Object .assign ({} , originalObj , { b : { f : 7 , g : 8 } });
console .log (copiedObj); // (1)
8. Destructuring Assignment
배열 혹은 객체를 해체하여 각각 변수에 할당한다.
1) 배열
Copy const [ a , b , c ] = [ 1 , 2 , 3 ];
console .log (a , b , c); // (1)
2) 객체
Copy const person = {
name : "나연" ,
age : 23 ,
gender : "female"
};
const { name: n , age: a , gender: g } = person;
console .log (n , a , g); // (1)
const { name , age , gender } = person; // (2)
console .log (name , age , gender);
9. template literals
여러줄 문자열, 보간(표현식 삽입) 등을 지원하는 새로운 형태의 문자열.
Copy console .log ( `a
bb
ccc` ); // (1)
Copy const a = 10 ;
const b = 20 ;
const str = ` ${ a } + ${ b } = ${ a + b } ` ;
console .log (str); // (1)
10. class
Java의 그것과 비슷하지만 private 메서드가 없다.
Copy class Person {
constructor (name , age , job) {
this .name = name;
this .age = age;
this .job = job;
}
toString () {
return ` ${ this .name } , ${ this .age } 세, 직업: ${ this .job } ` ;
}
getName () {
return this .name;
}
}
const olaf = new Person ( "olaf" , 27 , "front" );
olaf .getName ();
olaf .toString ();