-
[TIL] 2주차 - es6 , 일급객체로서의 함수, Map, Set이노베이션캠프/Js 문법 종합반 2023. 5. 23. 10:47
* ES6 문법소개 및 실습
1. ES6
Js의 버전 중 하나로 2015에 발표. 대규모 문법적 향상이 및 변경이 있었음
2. let, const
es6 이전에는 var만 사용됐었음
let(변수) / const(상수) : 재할당 가능 / 불가능
3. 화살표함수
let functionName = () => { //main logic }
한 줄일 때, ()와 {} 모두 삭제 가능
4. 삼항연산자
condition ? ture인경우 : false인 경우
5. 구조분해속성
배열이나, 객체의 속성을 분해해서 그 값을 변수에 담을 수 있게 해주는 문법
1) 배열인 경우(순서가 중요)
let [value1, value2] = [1, "new"]
이렇게 각각할당이 가능!
let arr = ["value1", "value2", "value3"]; // 값 let [a,b,c] = arr; // 변수 // let [a,b,c] = ["value1", "value2", "value3"]; 와 똑같은 두 줄
이것도 가능
let arr = ["value1", "value2", "value3"]; // 값 let [a,b,c,d] = arr; // 변수 //위에 변수를 하나 더 추가함. 그러면 Js는 '어, 들어와야하는 변수의 값이 하나 없네'라고 판단 // d는 undefined 가 됨
이런 경우 undefined가 되는 걸 막기 위해 기본값을 셋팅해주면 됨
let arr = ["value1", "value2", "value3"]; // 값 let [a,b,c,d=4] = arr; // 변수 //d=4 기본값 셋팅, 값이 들어올 경우 그걸로 바뀜
2) 객체인 경우
let user = { name: "abc", age: 30, }; let {name, age} = user; //name과 age 라는 키가 구조분해할당이 되어 "abc"와 30이라는 값을 가지게 됨 //오른쪽에 있는 이 객체의 각각의 요소를 분해해서 왼쪽에 있는 name과age라는 각각의 변수에 할당해준다 console.log(name); // abe string임 console.log(age); //30 number임 //name과 age는 더이상 객체형태가 아니라 string와 number로 나오게 되는 걸 볼 수 있음
let user = { name: "abc", age: 30, }; let { name: newName, age: newAge, } = user; // name의 값을 newName이라는 변수에 넣어달라, age의 값을 newAge라는 변수에 넣어달라 는 거임! // 그래서 여기서는 console.log할 때 아래와 같이 해야 위와 같은 결과가 나옴 console.log(newName) // abc console.log(newAge) // 30
let user = { name: "abc", age: 30, }; let {name, age, birthday} = user; // 객체에 없는 키값을 넣어봄 그러면 배열과 똑같이 됨 console.log(name); // abe console.log(age); // 30 console.log(birthday); // undefined
배열과 똑같이 없는 값을 받으려고 하면 undefined가 나옴
let user = { name: "abc", age: 30, }; let {name, age, birthday="today"} = user; // 배열과 같이 초기값 넣기 가능 console.log(name); // abe console.log(age); // 30 console.log(birthday); // today
구조분해를 통해 받는 값에 birthday: "yesterday"와 같이 값이 들어가면 초기값 대신 들어간 값이 당연히 들어오게 됨. 말그대로 초기값은 초기값!
6. 단축 속성명 : property shorthand
1) 배열
const name = "abc"; const age = "30"; const obj = { name, // name:name age, // age:age } // 이와같이 이름이 겹치는 경우 과감하게 생략이 가능하다는 거임. 키 밸류가 똑같으면 생략이 가능하다!
7. 전개 구문 : spread operator
destructuring과 함께 가장 많이 사용되는 es6 문법 중 하나
let arr = [1,2,3]; console.log(arr) // [1, 2, 3] console.log(...arr) // 1 2 3
...arr이 전개 구문 사용한 것! 어떨때 쓰이나? 아래참고
let Arr = [1,2,3] //여기에 4를 추가하고 싶을 때 push를 사용할 수도 있겠지만 let newArr = [...arr]; console.log(arr); //[1,2,3] console.log(newArr); //[1,2,3] //현재 둘이 같음 그러므로 아래와 같이 해주면 newArr = [...arr, 4] console.log(newArr); // [1,2,3,4] 가 되는 거임! 풀렀다가 다시 묶어주니께
2) 객체
let user = { name: 'abc'; age: 30, }; lset user2 = {...user}; console.log(user); // {name:'abc', age:30} console.log(user2); // {name:'abc', age:30}
8. 나머지 매개변수(rest parameter)
function expleFunc(a,b,c,...args) { console.log(a,b,c); console.log(...args); }; //매개변수의 갯수를 정확히 모를 때 ,...args 라고 명시해줄 수 있음 expleFunc(1,2,3,4,5,6,7); // 1 2 3 // 4 5 6 7 //스프레드 문법(...)을 빼주면 function expleFunc(a,b,c,...args) { console.log(a,b,c); console.log(args); }; //매개변수의 갯수를 정확히 모를 때 ,...args 라고 명시해줄 수 있음 expleFunc(1,2,3,4,5,6,7); // 1 2 3 // [4, 5, 6, 7]
꼭 ...args로 명시해줘야함
9. 템플릿 리터럴(Template Literal)
백틱 사용, js 변수 멀티라인 지원
console.log(`Hello world ${3+3}`); // Hello world 6 let testVlaue = "안녕하세요" console.log(`Hello world ${testValue}`); // Hello world 안녕하세요
console.log(` Hello My name is Javascipt!!! Nice to meet you!! `); /*- Hello My name is Javascipt!!! Nice to meet you!! *-/ //모양 그대로 나옴!!!!!! 개쩐다
* 일급 객체로서의 함수
일급객체(First-class Object) : 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체
즉, 그냥 객체와 같다는 거임
함수를 매우 유연하게 사용할 수 있음!!
1. 변수에 함수를 할당할 수 있다.
다른 프로그래밍 언어에서는 말도 안됨
함수를 마치 값처럼 취급할 수 있음.
함수가 나중에 사용될 수 있도록 조치가 됨.
const sayHello = function() { console.log("Hello"); };
sayHello라는 변수에 함수를 할당함.
2. 함수를 인자로 다른 함수에 전달할 수 있다
1) 콜백함수 : 매개변수로써 쓰이는 함수
2) 고차함수 : 함수를 인자로 받거나 return 하는 함수
콜백함수는 고차함수의 한 종류라고 볼 수 있음
function callFunction (func) { //매개변수로 받은 변수가, 함수라는 것 func(); }; const sayHello = function() { console.log("Hello"); }; callFunction(sayHello);
3. 함수를 반환할 수 있다.
function createAdder(num) { return function(x) { return x + num; }; }; const addFive = createAdder(5); console.log(addFive(10)); // 15
4. 일급객체로써의 함수(2)
const person = { name:'John', age: 31, isMarried: true, sayHello: function() { console.log(`Hello, My name is ${this.name}`); }, //여기서 화살표 함수는 사용이 어려움. 화살표 함수는 this를 바인딩하지 않음. 화살표 함수로 다시 작성할시 // this.name부분에 undefined가 뜸 ); person.sayHello(); // Hello, May name is John
5. 배열의 요소로 함수를 할당
const myArr = [ function(a,b){ return a+b; }, function(a,b){ return a-b; }, ]; console.log(myArr[0](1,3)); //4 console.log(myArr[1](10,7)); //3
함수조합도 가능
function multiplyBy(num) { return function (x) { return x * num; }; } function add(x,y){ return x+y; }; const multiplyByTwo = multiplyBy(2); const multiplyByThree = multiplyBy(3); const result = add(multiplyByTwo(5), multiplyByThree(10)); console.log(result); // 40
*Map
Js의 객체, 배열을 통하여 많고, 다양하고, 복잡한 프로그램들을 만들어옴
그럼에도 현실세계를 반영하기는 좀 어려움
그래서 Map, Set과 같은 추가적인 자료구조가 등장함
Map, Set의 목적 : 데이터의 구성, 검색, 사용을 효율적으로 처리 > 기존의 객체 또는 배열보다
1. Map
- Key / Value
- Key에 어떤 데이터타입(유형)도 들어올 수 있다
- Map은 키가 정렬된 순서로 저장되기 때문이다.
- 기능: 검색, 삭제, 제거, 여부 확인
- 기본적인 모양
const myMap = new Map(); myMap.set('key', 'value'); //... //... myMap.get('key') //key로 검색가능 그래서 set과 get은 항상 pair다
- 대량데이터를 처리하기 위해 만들어진 자료구조이므로 반복이 중요함
- 반복을 위해 사용되는 method : keys, values, entries
1) iterator
- 위의 method를 사용할 수 있는 이유는, 이들이 다 iterator를 가지고 있는 덕분임
- iterator이란? 반복자라는 말임.
- iterator 를 가지고 있으면 Js에서는 for... of 라는 걸 쓸 수 있음. 하나하나 돌면서 사용이 가능하다는 거임.
2) 예시와함께 method 알아보기
const myMap = new Map(); myMap.set('one', 1); myMap.set('two', 2); myMap.set('three', 3); console.log(myMap.keys()); // [Map Iterator] {'one', 'two', 'three'} for(const key of myMap.key()){ console.log(key); } /*- one two three -*/ console.log(myMap.values()); // [Map Iterator] {1, 2, 3} for(const value of myMap.values()){ console.log(value); } /*- 1 2 3 -*/ console.log(myMap.entries()); // [Map Iterator] {['one',1], ['two',2], ['three',3]} for(const entrie of myMap.entries()){ console.log(entrie); } /*- ['one',1] ['two',2] ['three',3] -*/
3) Map의 크기 확인
console.log(myMap.size); //3 //Map의 사이즈(길이)
4) Map의 특정 key 확인
console.log(myMap.has("two")); //true //key 기반 검색
*Set
고유한 값을 저장하는 자료구조
값만 저장함. 키를 저장하지는 않음
값이 중복되지 않는 유일한 요소로만 구성된다
1. Set
1) 생성
const mySet = new Set(); mySet.add('value1'); mySet.add('value2');
2) 사이즈 확인
console.log(mySet.size); // 2
3) 값의 여부
console.log(mySet.has('value2')); //true
4) 반복
const mySet = new Set(); mySet.add('value1'); mySet.add('value2'); mySet.add('value3'); mySet.add('value5'); mySet.add('value8'); for(const value of mySet.values()) { console.log(value); } /*- value1 value2 value3 value5 value8 *-/ // value만 있으므로 values()만 있음
- 관련 MDN
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Set
'이노베이션캠프 > Js 문법 종합반' 카테고리의 다른 글
[TIL] 4주차 : callback 함수 (0) 2023.05.25 [TIL] 3주차 : 실행컨텍스트, 호이스팅, this (0) 2023.05.24 [TIL] 3주차 : 데이터 타입(심화) (0) 2023.05.23 [TIL] 1주차 (0) 2023.05.22