흔히 ES6이라 불리는 javaScript언어의 표준이다.
아직도 ES6전 코딩방식을 하고 있다면 지금부터 습관을 바꿔 보도록 해보쟈 !!!🔥🔥🔥🔥
구조분해할당이라 불린다.
배열과 객체의 속성을 해체하여 그값을 개별 변수에 담을 수 있게 하는 표현식 입니다.
//선언에서 분리한 할당
let a, b, rest;
[a,b] = [10,20];
console.log(a);//10
console.log(b);//20
[a, b, ...rest] = [10, 20, 30, 40, 50];
console.log(a); // 10
console.log(b); // 20
console.log(rest); // [30, 40, 50]
//기본 변수 할당
let x = [1,2,3,4,5];
let [y,z] =x;
console.log(y); // 1
console.log(z); // 2
//기본값
let a,b;
[a = 5, b =7] = [1];
console.log(a); // 1 -> 값이 재할당
console.log(b); // 7
//변수값 교환하기
let a = 1;
let b = 3;
[a,b] = [b,a];
console.log(a); // 3
console.log(b); // 1
//함수가 반환한 배열 분석
function f(){
return [1,2];
}
let a,b,;
[a,b] = f();
console.log(a); // 1
console.log(b); // 2
//일부 반환값 무시하기
function f(){
return [1,2,3];
}
let [a, ,b]=f();
console.log(a); // 1
console.log(b); // 3
//반환값을 모두 무시 할 수도 있다.
[,,] = f();
//변수에 배열의 나머지를 할당하기
let[a,...b] = [1,2,3];
console.log(a); // 1
console.log(b); // [2,3]
//기본할당
let o = {p:42, q:ture};
let {p,q} = o;
console.log(p); // 42
console.log(q); // true
//선언없는할당
let a,b;
({a,b} = {a:1, b:2}); //->전체 ()가 없으면 에러
//새로운 변수 이름으로 할당하기
let o = {p:42, q:true};
let {p:foo, q:bar} = o;
console.log(foo); // 42
console.log(bar); // true
//기본값(객체로부터 해체된 값이 undefined인 경우, 변수에 기본값을 할당할 수 있다.)
let {a = 10, b = 5} = {a:3};
console.log(a); // 3
console.log(b); // 5
//기본값 갖는 새로운 이름의 변수에 할당하기
let {a : aa =10, b: bb =5} = {a:3};
console.log(aa); // 3
console.log(bb); // 5
응용해보기
//ES6
const obj2 = {
h: 'Eich',
i: {
j: 'Jay'
}
}
const { h, i: { j }, k } = obj2;
console.log(h, j, k); // 'Eich', 'Jay', undefined
h변수 값을 자동으로 obj에서 찾아 넣어주고 j값도 obj2안의 i 객체에서 찾아 넣어 줌으로써 한줄의 코드로 객체를 해체해버리는것이다. 또한 위의 k처럼 obj2에 없는 변수를 선언했을 경우, 자동으로 udefined값이 들어가기 때문에 에러가 발생하지 않는다.
Spread operator
전개구문을 사용하면 배열이나 문자열과 같이 반복 가능한 문자를 0개 이상의 인수 또는 요소로 확장하여 , 0개 이상의 키 값의 쌍으로 객체로 확장 시킬 수 있습니다.
Rest parameters
정해지지 않은 수 인수를 배열로 나타낼 수 있게 합니다.
이터러블 : Array, String, Map, Set, DOM 구조 이며, interator를 생성해서 next()로 순회 할 수 있는 자료구조가 이터러블이라고 생각하면 된다.
일반적으로 배열의 엘리먼트를 함수의 매개변수로 사용하조가 할때 apply를 사용하였습니다.
그러나 ES6부터는 Spread operator로 가능합니다.
//ES5
function myFunction(x, y, z) { }
var args = [0, 1, 2];
myFunction.apply(null, args);
//ES6
function myFunction(x, y, z) { }
var args = [0, 1, 2];
myFunction(...args);
//ES5
var arr = [1, 2, 3];
console.log(arr.concat([4, 5, 6])); // [ 1, 2, 3, 4, 5, 6 ]
// ES6
const arr = [1, 2, 3];
// ...arr은 [1, 2, 3]을 개별 요소로 분리한다
console.log([...arr, 4, 5, 6]); // [ 1, 2, 3, 4, 5, 6 ]
🌸 팁 배열 복사 !!
var arr = [1, 2, 3];
var arr2 = [...arr]; // arr.slice() 와 유사
arr2.push(4);
// arr2 은 [1, 2, 3, 4] 이 됨
// arr 은 영향을 받지 않고 남아 있음
//////////
var a = [[1], [2], [3]];
var b = [...a];
b.shift().shift(); // 1
// 이제 배열 a 도 영향을 받음: [[], [2], [3]]
1레벨 깊이에서는 Spread operator가 효과 적으로 동작 하지만 , 다차원 배열 복사에는 적합하지 않을 수 있습니다.
// ES6
function foo(x, y, z) {
console.log(x); // 1
console.log(y); // 2
console.log(z); // 3
}
const arr = [1, 2, 3];
foo(...arr);// Array를 받아서 각 매개변수로 전달되었다.
const o1 = { x: 1, y: 2 };
const o2 = { ...o1, z: 3 };
console.log(o2); // { x: 1, y: 2, z: 3 }
const target = { x: 1, y: 2 };
const source = { z: 3 };
// Object.assign를 사용하여도 동일한 작업을 할 수 있다.
// Object.assign은 타깃 객체를 반환한다
console.log(Object.assign(target, source)); // { x: 1, y: 2, z: 3 }
함수의 마지막 파라미터 앞에 ...를 붙여 모든 나머지 인수를 표준 자바스크립트 배열로 대체 합니다.
마지막 파라미터만 Rest파라미터가 될 수 있습니다.
...rest파라미터 다음으로 ,(콤마)가 올 수 없습니다.
function myFun(a, b, ...manyMoreArgs) {
console.log("a", a);
console.log("b", b);
console.log("manyMoreArgs", manyMoreArgs);
}
myFun("one", "two", "three", "four", "five", "six");
// Console Output:
// a, one
// b, two
// manyMoreArgs, [three, four, five, six]
기본값 함수 매개변수를 사용하면 값이 없거나 undefined가 전달될 경우 이름붙은 매개변수를 기본값으로 초기화할 수 있습니다.
function multiply(a, b) {
return a * b
}
multiply(5, 2) // 10
multiply(5) // NaN !
multiply호출시 매개변수 b가 없으면 NaN을 반환합니다.
이를 방지 하기 위해 매개변수가 없을시 아래 코드와 같이 1로 설정하는 방식을 사용하곤 했습니다.
function multiply(a, b) {
b = (typeof b !== 'undefined') ? b : 1
return a*b
}
multiply(5, 2) // 10
multiply(5) // 5
그러나 ES6에선 간단히 기본값을 설정 할 수 있습니다.
function multiply(a, b = 1) {
return a*b
}
multiply(5, 2) // 10
multiply(5) // 5
multiply(5, undefined) // 5
일반 문자열과 비슷해 보이지만 'or"같은 통상적인 따옴표 대신 백틱(backtick)`을 사용하다.
백틱 안에서 표현되는 것은 그대로 출력된다. 띄어쓰기나,줄바꿈도 가능 그대로 출력된다 (개이득)
+연사자를 사용하지 않아도 새로운 문자열을 삽입할 수 있는 기능을 제공한다. 이를 문자열 인터폴레이션 (String Iterpolation)이라 한다.
const name = "당근" const age = 26 console.log(`my name is ${name} 그리고 나는 ${age}살이다.`);
const add = function (x, y) {
return x + y
}
위에 코드를 화살표 함수를 이용해서 변경해봅시다
const add = (x, y) => {
return x + y
}
위에 코드 에서 return 을 생략 할 수 있습니다.
const subtract = (x, y) => x - y
필요에 따라 소괄호를 붙일 수도 있습니다.
const multiply = (x, y) => (x * y)
파라미터가 하나 일결우 소괄호 생략이 가능합니다.
const divideBy10 = x => x / 10
화살표 함수를 이용한 클로저의 이용입니다.
const adder = x => {
return y => {
return x + y
}
}
더 간단히 줄이면
const adder = x => y => { x + y }
화살표 함수는 자신의 this가 없습니다.
대신 화살표 함수를 둘러싸는 렉시컬 범위(lexical scope)의 this가 사용됩니다. 즉 화살표 함수는 바로 바깥 범위에서 this를 찾는다. !!
function Person(){
this.age = 0;
setInterval(() => {
this.age++; // |this|는setInterval이 아닌 Person 객체를 참조
}, 1000);
}
반복가능한 객체 (Array,Map,Set,String,argument객체등을 포함)에 대해서 반복하고 각 개별 속성값에 대해 실행되는 문이 있는 사용자 정의 반복 후크를 호출하는 루프를 생성합니다.
for (variable of iterable) {
statement
}
let iterable = [10, 20, 30];
for (let value of iterable) {
console.log(value);
}
// 10
// 20
// 30
!!!!헷갈리지 말기 !!!!!
for...in 루프는 객체의 모든 열거가능한 속성에 대해 반복합니다.
var obj = {a: 1, b: 2, c: 3};
for (const prop in obj) {
console.log(`obj.${prop} = ${obj[prop]}`);
}
// Output:
// "obj.a = 1"
// "obj.b = 2"
// "obj.c = 3"
수료까지 화이팅하세요👍🏼