ES6에서 let
키워드는 블록레벨 스코프 변수를 선언하는데 사용된다. 자바스크립트에서 기존의 var
키워드는 함수레벨 스코프였고, 이는 메모리 문제와 가독성, 디버깅의 어려움등의 이슈가 있었고 이에 대한 해결책으로 내놓은 키워드이다.
앞서 얘기했듯, var
키워드로 변수를 선언하는 것은 함수레벨 스코프이다. 함수레벨 스코프는 함수 밖에서 선언 되었을 경우 전역에서 접근이 가능하다. 하지만, 함수 내부에서 선언되었을 경우 전역에서 접근이 불가능하다. 또한, if
블록 내부에서 선언된 변수 역시 함수레벨스코프이기 때문에, if 내부에서 선언한 코드 역시 전역에서 접근할 수 있다.
이렇기 때문에, ES6에서는 블록 레벨 스코프를 가지는 변수를 선언하는 let
키워드를 제시했다.
let
키워드로 선언된 변수는 블록레벨 스코프 변수이다. 말 그대로, 블록 내부에서 선언된 경우 전역에서 접근이 불가능하며 오직 블록 내부에서만 접근이 가능하다.
var
키워드로 변수를 재 선언하게되면, 재 선언된 변수가 기존의 변수를 대체한다. 하지만 let
키워드는 같은 스코프 내에서 재선언을 하게 되면 에러가 발생한다.
ES6 코드를 작성할 때에는, var
대신 let
으로 통일하는 것을 권장한다. 이는 스코핑 실수나 버그를 예방하고, 코드의 가독성을 올려준다. 하지만, var
을 절대로 쓰면 안되는 것은 아니다.
ES6에서 const
키워드는 오직 읽기 전용 변수에만 사용한다. 즉, 값을 재할당 할 수 없다. 메모리의 주소를 변경할 수 없다.
let
의 스코핑 방식과 일치한다. 블록레벨 스코프를 가진다.
자바스크립트에서는 함수호출시 전달되지 않은 인수에 대해서는 undefined
를 할당한다. 혹은, 삼항연산자를 이용하여 디폴트 값을 정한다.
function myFunction(x, y, z)
{
x = x === undefined ? 1 : x;
y = y === undefined ? 2 : y;
z = z === undefined ? 3 : z;
console.log(x, y, z); //Output "6 7 3"
}
myFunction(6, 7);
ES6는 새로운 구문을 이용하여 디폴트 파라미터 값을 정할 수 있게 해준다.
function myFunction(x = 1, y = 2, z = 3)
{
console.log(x, y, z); // Output "6 7 3"
}
myFunction(6,7);
spread operator 은 ...
를 사용한다. spread operator은 iterable 한 객체를 individual한 값으로 나누어 준다. 주로 iterable한 객체를 분리하여 함수의 인자로 넘길 때 사용한다.
function myFunction(a, b)
{
return a + b;
}
let data = [1, 4];
let result = myFunction(...data);
console.log(result); //Output "5"
// let result = myFunction(1,4);
// 와 똑같다.
또한, 코드에서 요소에 대해서도 사용 할 수 있다. 다음 예시를 보자.
let array1 = [2,3,4];
let array2 = [1, ...array1, 5, 6, 7];
console.log(array2); //Output "1, 2, 3, 4, 5, 6, 7"
rest parameter 도 ...
를 사용한다. rest parameter란, 말그대로 나머지 파라미터를 뜻한다.
function myFunction(a, b, ...args)
{
console.log(args); //Output "3, 4, 5"
}
myFunction(1, 2, 3, 4, 5);
구조 분해 할당이란, iterable 또는 객체의 값이나 프로퍼티를 변수에 할당 시키는 표현식이다.
let myArray = [1, 2, 3];
let a, b, c;
[a, b, c] = myArray; //array destructuring assignment syntax
// another way
let [a, b, c] = [1, 2, 3];
// default value
let [a, b, c = 3] = [1, 2];
console.log(c); //Output "3"
// nested array
let [a, b, [c, d]] = [1, 2, [3, 4]];
배열에서는 위와 같은 방식으로 사용할 수 있다.
나머지 매개변수를 통해서 구조분해할당을 할 수 있다.
let [a, ...b] = [1, 2, 3, 4, 5, 6];
console.log(a);// 1
console.log(Array.isArray(b));// true
console.log(b); // 2,3,4,5,6
구조분해할당을 이용하여 파라미터로 넘겨줄 수 있다. 또한, default value 또한 정할 수 있다.
function myFunction([a, b, c = 3])
{
console.log(a, b, c); //Output "1 2 3"
}
myFunction([1, 2]);
// default value for destructuring assignment
function myFunction([a, b, c = 3] = [1, 2, 3])
{
console.log(a, b, c); //Output "1 2 3"
}
myFunction(undefined);
개념은 같다. 프로퍼티 값을 추출하여 변수에 할당하기 위해 쓴다. 다음과 같이 쓰인다.
// 기존의 코드
var object = {"name" : "John", "age" : 23};
var name = object.name;
var age = object.age;
// ES6 객체 구조분해할당
let object = {"name" : "John", "age" : 23};
let name, age;
({name, age} = object); //object destructuring assignment syntax
// nested object
let {name, otherInfo: {age}} = {name: "Eden", otherInfo: {age:
23}};
console.log(name, age); //Eden 23