문서의 선택한 두 판 사이의 차이를 보여줍니다.
| study:ecma2015 [2024/10/06 14:15] – [language 기본] taekgu | study:ecma2015 [2025/04/15 10:05] (현재) – 바깥 편집 127.0.0.1 | ||
|---|---|---|---|
| 줄 1: | 줄 1: | ||
| + | |||
| + | ====== ECMA2015(ES6) ====== | ||
| + | [[book: | ||
| + | |||
| + | * [[http:// | ||
| + | * [[https:// | ||
| + | * [[javascript: | ||
| + | * [[http:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[javascript: | ||
| + | * [[javascript: | ||
| + | * [[javascript: | ||
| + | * [[javascript: | ||
| + | * [[javascript: | ||
| + | * avgrund - popup jQuery lib | ||
| + | |||
| + | * [[http:// | ||
| + | * [[javascript: | ||
| + | * DevTool열기< | ||
| + | `Control+Shift+J` | ||
| + | `Command+Option+J`(Mac의 경우)를 | ||
| + | | ||
| + | </ | ||
| + | | ||
| + | ===== Netscape --javascript(JAVA ..) ===== | ||
| + | |||
| + | - prototype | ||
| + | - jquery | ||
| + | - React - facebook 서비스(라이브리성...) | ||
| + | - AngularJS - Angular1.0 - Google -- javascript | ||
| + | - Vue | ||
| + | - Angular 2 --> Angular -- typescript | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | * [[javascript: | ||
| + | * [[javascript: | ||
| + | * [[javascript: | ||
| + | * [[javascript: | ||
| + | * [[javascript: | ||
| + | * [[javascript: | ||
| + | * [[javascript: | ||
| + | ===== ECMAScript 2015 ===== | ||
| + | |||
| + | |||
| + | ES6 === ES2015 | ||
| + | (ES2016, | ||
| + | ES2015 | ||
| + | 개선된 JavaScript문법\\ | ||
| + | ES6 browser compatibility의 훌륭한 지원.\\ | ||
| + | ES6를 기반으로 한 JavaScript생태계의 확산.\\ | ||
| + | [[https:// | ||
| + | ==== language 기본 ==== | ||
| + | * var | ||
| + | * function scope | ||
| + | * let | ||
| + | * block scope like for a general programming language | ||
| + | * const | ||
| + | * 재할당을 하지 못한다. | ||
| + | * 배열의 push등은 가능하다. | ||
| + | * immutable array를 만들어서 사용할 수 있다. | ||
| + | * <code javascript> | ||
| + | const list = [" | ||
| + | const list2 = [].concat(list, | ||
| + | console.log(list2); | ||
| + | console.log(list === list2); | ||
| + | </ | ||
| + | * string에 추가 method | ||
| + | * startsWith | ||
| + | * endsWith | ||
| + | * includes | ||
| + | * for of - 순회하기 | ||
| + | * <code javascript> | ||
| + | var data = [1,2,234]; | ||
| + | data.forEach(function(value, | ||
| + | console.log(value); | ||
| + | }); | ||
| + | |||
| + | data.forEach(function(value){ | ||
| + | console.log(data[a]); | ||
| + | } | ||
| + | for(let idx in data) { | ||
| + | console.log(data[idx]); | ||
| + | } | ||
| + | Array.prototype.getIndex = function(){} | ||
| + | // for in 에서 문제발생 | ||
| + | // Object의 function도 같이 순회한다. | ||
| + | |||
| + | for(let value of data) { | ||
| + | console.log(value); | ||
| + | } | ||
| + | |||
| + | let str = 'asdf 111'; | ||
| + | for(let value of str) { // character단위로 순회한다. | ||
| + | console.log(value); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | * || ?? operator | ||
| + | * < | ||
| + | |||
| + | alert(height || 100); // 100 | ||
| + | alert(height ?? 100); // 0 | ||
| + | </ | ||
| + | * spread operator, 펼침연산자 | ||
| + | * <code javascript> | ||
| + | let pre = [" | ||
| + | let newData = [...pre]; | ||
| + | console.log(pre === newData); | ||
| + | </ | ||
| + | * <code javascript> | ||
| + | let pre=[100, | ||
| + | |||
| + | let newData = [0,1,2,3, ...pre, 4]; | ||
| + | </ | ||
| + | * Argument로 넘겨 줌 <code javascript> | ||
| + | function sum(a,b,c){ | ||
| + | return a+b+c; | ||
| + | } | ||
| + | let pre = [100, | ||
| + | console.log(sum.apply(null, | ||
| + | |||
| + | console.log(sum(...pre)); | ||
| + | </ | ||
| + | |||
| + | === ES2015 from method === | ||
| + | |||
| + | <code javascript> | ||
| + | function addMark(){ | ||
| + | let newData = []; | ||
| + | | ||
| + | for(let i=0; i < arguments.length; | ||
| + | newData.push(arguments[i] + " | ||
| + | } | ||
| + | | ||
| + | console.log(newData); | ||
| + | } | ||
| + | |||
| + | addMark(1, | ||
| + | </ | ||
| + | argument.map활용 --> Error남... 배열같지만 배열이 아닌 것들이 javascript에는 존재한다. | ||
| + | <code javascript> | ||
| + | function addMark(){ | ||
| + | //let newData = arguments.map(function(value){ //--> Error | ||
| + | let newarray = Array.from(arguments); | ||
| + | let newData = newarray.map(function(value){ | ||
| + | return value + " | ||
| + | }); | ||
| + | | ||
| + | console.log(newData); | ||
| + | } | ||
| + | |||
| + | addMark(1, | ||
| + | </ | ||
| + | |||
| + | ==== 예제1 ==== | ||
| + | <code html ex1.html> | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | <meta charset=" | ||
| + | <meta name=" | ||
| + | < | ||
| + | </ | ||
| + | < | ||
| + | <ul> | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | < | ||
| + | </ul> | ||
| + | </ | ||
| + | </ | ||
| + | </ | ||
| + | |||
| + | === 문제 === | ||
| + | <code javascript ex1.js> | ||
| + | function print() { | ||
| + | /* | ||
| + | filter, includes, from을 사용해서 문자열' | ||
| + | 노드로 구성된 배열을 만들어서 반환하기 | ||
| + | */ | ||
| + | } | ||
| + | |||
| + | print(); | ||
| + | </ | ||
| + | |||
| + | === 풀이 === | ||
| + | <code javascript aw1.js> | ||
| + | function print() { | ||
| + | /* | ||
| + | filter, includes, from을 사용해서 문자열' | ||
| + | 노드로 구성된 배열을 만들어서 반환하기 | ||
| + | */ | ||
| + | let list = document.querySelectorAll(" | ||
| + | console.log(toString.call(list)); | ||
| + | | ||
| + | let listArray = Array.from(list); | ||
| + | console.log(toString.call(listArray)); | ||
| + | | ||
| + | let eArray = listArray.filter(function(v){ | ||
| + | //return v.includes(" | ||
| + | return v.innerText.includes(" | ||
| + | }); | ||
| + | return eArray; | ||
| + | } | ||
| + | |||
| + | console.log(print()); | ||
| + | </ | ||
| + | |||
| + | ==== Object ==== | ||
| + | function을 이용한 Object생성 | ||
| + | <code javascript> | ||
| + | function getObj(){ | ||
| + | const name = " | ||
| + | | ||
| + | const getName = function() { | ||
| + | return name; | ||
| + | } | ||
| + | | ||
| + | const setName = function(newName) { | ||
| + | name = newName; | ||
| + | } | ||
| + | | ||
| + | const printName = function() { | ||
| + | console.log(name); | ||
| + | } | ||
| + | | ||
| + | // return { | ||
| + | // getName: getName, | ||
| + | // setName: setName | ||
| + | // } | ||
| + | return { getName, setName } | ||
| + | } | ||
| + | |||
| + | var obj = getObj(); | ||
| + | console.log(obj.getName()); | ||
| + | </ | ||
| + | |||
| + | ==== Destructuring ==== | ||
| + | |||
| + | === Array ==== | ||
| + | <code javascript> | ||
| + | let data = [" | ||
| + | let [jisu,, | ||
| + | console.log(jisu, | ||
| + | </ | ||
| + | |||
| + | === Object === | ||
| + | <code javascript> | ||
| + | let obj = { | ||
| + | name : " | ||
| + | address : " | ||
| + | age : 10 | ||
| + | } | ||
| + | obj[" | ||
| + | obj.name; | ||
| + | ; | ||
| + | |||
| + | obj = $.extend(obj, | ||
| + | { | ||
| + | name2 : " | ||
| + | } | ||
| + | ) | ||
| + | obj[" | ||
| + | obj[" | ||
| + | obj.name2; | ||
| + | |||
| + | |||
| + | let {name: | ||
| + | console.log(myName, | ||
| + | </ | ||
| + | |||
| + | === 활용 JSON파싱 === | ||
| + | <code javascript> | ||
| + | var news = [ | ||
| + | { " | ||
| + | " | ||
| + | " | ||
| + | ] | ||
| + | }, | ||
| + | { " | ||
| + | " | ||
| + | " | ||
| + | ] | ||
| + | } | ||
| + | ]; | ||
| + | |||
| + | let [,mbc] = news; | ||
| + | let {title, imgurl} = mbc; | ||
| + | console.log(title, | ||
| + | |||
| + | </ | ||
| + | |||
| + | <code javascript> | ||
| + | let [, | ||
| + | console.log(title, | ||
| + | </ | ||
| + | |||
| + | <code javascript> | ||
| + | function getNewsList([, | ||
| + | console.log(newslist); | ||
| + | } | ||
| + | getNewsList(news); | ||
| + | </ | ||
| + | |||
| + | === Event === | ||
| + | <code javascript> | ||
| + | document.querySelector(" | ||
| + | console.log(evt); | ||
| + | }); | ||
| + | document.querySelector(" | ||
| + | console.log(target.tagName); | ||
| + | }); | ||
| + | document.querySelector(" | ||
| + | console.log(type); | ||
| + | }); | ||
| + | </ | ||
| + | |||
| + | ==== SET ==== | ||
| + | 자료구조 Set - 중복없이 유일한 값을 저장하려고 할때, 이미 존재하는지 체크할 때 유용. | ||
| + | <code javascript> | ||
| + | let mySet = new Set(); | ||
| + | console.log(toString.call(mySet)); | ||
| + | |||
| + | mySet.add(" | ||
| + | mySet.add(" | ||
| + | mySet.add(" | ||
| + | |||
| + | console.log(mySet.has(" | ||
| + | |||
| + | mySet.forEach(function(v){ | ||
| + | console.log(v); | ||
| + | }); | ||
| + | |||
| + | |||
| + | mySet.delete(" | ||
| + | </ | ||
| + | |||
| + | === WeakSet === | ||
| + | 참조를 가지고 있는 객체만 지정이 가능하다. | ||
| + | 객체형태를 중복없이 저장하려고 할때 유용하다. | ||
| + | <code javascript> | ||
| + | let arr = [1,2,3,4]; | ||
| + | let ws = new WeekSet(); | ||
| + | |||
| + | ws.add(arr); | ||
| + | ws.add(111); | ||
| + | ws.add(" | ||
| + | ws.add(null); | ||
| + | ws.add(fuction(){}); | ||
| + | console.log(ws); | ||
| + | </ | ||
| + | |||
| + | <code javascript> | ||
| + | let arr = [1,2,3,4]; | ||
| + | let arr2 = [5,6,7,8]; | ||
| + | let obj = {arr, arr2}; | ||
| + | let ws = new WeekSet(); | ||
| + | |||
| + | ws.add(arr); | ||
| + | ws.add(arr2); | ||
| + | ws.add(obj); | ||
| + | |||
| + | arr = null; | ||
| + | arr2 = null; | ||
| + | console.log(ws); | ||
| + | console.log(ws.has(arr), | ||
| + | </ | ||
| + | ==== map & WeakMap ==== | ||
| + | Array --> set,weakset | ||
| + | Object --> map, weakmap | ||
| + | |||
| + | map은 key/ | ||
| + | |||
| + | <code javascript> | ||
| + | let wm = new WeakMap(); | ||
| + | let myfun = function(){}; | ||
| + | // 이 함수가 얼마나 실행됐는지를 알려고 할때 | ||
| + | |||
| + | wm.set(myfun, | ||
| + | |||
| + | console.log(wm); | ||
| + | |||
| + | let count = 0; | ||
| + | for(let i=0; | ||
| + | count = wm.get(myfun); | ||
| + | count++; | ||
| + | wm.set(myfun, | ||
| + | } | ||
| + | |||
| + | console.log(wm.get(myfun)); | ||
| + | </ | ||
| + | |||
| + | |||
| + | <code javascript> | ||
| + | myfun = null; | ||
| + | console.log(wm.get(myfun)); | ||
| + | |||
| + | console.log(wm.has(myfun)); | ||
| + | |||
| + | </ | ||
| + | |||
| + | === WeakMap 활용 --> private === | ||
| + | <code javascript> | ||
| + | function Area(height, | ||
| + | this.height = height; | ||
| + | this.width = width; | ||
| + | } | ||
| + | |||
| + | Area.prototype.getArea = function(){ | ||
| + | return this.height * this.width; | ||
| + | } | ||
| + | |||
| + | lget myarea = new Area(10, | ||
| + | console.log(myarea.getArea()); | ||
| + | console.log(myarea.height); | ||
| + | </ | ||
| + | |||
| + | === weakmap의 전역변수를 이용 === | ||
| + | <code javascript> | ||
| + | const wm = new WeakMap(); | ||
| + | function Area(height, | ||
| + | | ||
| + | } | ||
| + | |||
| + | Area.prototype.getArea = function(){ | ||
| + | const {height, width} = wm.get(this); | ||
| + | return height * width; | ||
| + | } | ||
| + | lget myarea = new Area(10, | ||
| + | console.log(myarea.getArea()); | ||
| + | console.log(myarea.height); | ||
| + | |||
| + | |||
| + | // | ||
| + | |||
| + | console.log(wm.has(myarea));// | ||
| + | myarea = null; | ||
| + | console.log(wm.has(myarea));// | ||
| + | // Garbage Collection | ||
| + | </ | ||
| + | |||
| + | ==== 실습.Destructuring and Set 활용 ==== | ||
| + | === lotto번호만들기. === | ||
| + | - 유일한값을 추출하는 과정에서 Set을 사용합니다. | ||
| + | - getRandomNumber함수에 변수를 전달하는 과정에서 destructuring을 사용해봅시다. | ||
| + | <code javascript> | ||
| + | const SETTING = { | ||
| + | name : "LUCKY LOTTO!", | ||
| + | count : 6, | ||
| + | maxNumber : 45 | ||
| + | } | ||
| + | |||
| + | function getRandomNumber(maxNumber) { | ||
| + | // 랜덤한 유일한 숫자값을 추출 | ||
| + | } | ||
| + | </ | ||
| + | === Answer === | ||
| + | |||
| + | <code javascript> | ||
| + | const SETTING = { | ||
| + | name : "LUCKY LOTTO!", | ||
| + | count : 6, | ||
| + | maxNumber : 45 | ||
| + | } | ||
| + | |||
| + | function getRandomNumber(maxNumber) { | ||
| + | // 랜덤한 유일한 숫자값을 추출 | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Template처리 ==== | ||
| + | json으로 응답을 받고, | ||
| + | javascript object로 변환한 후에 어떠한 데이터처리 조작을 한 후에 dom에 추가! | ||
| + | 데이터 + HTML문자열의 결합이 필요하기 때문에 | ||
| + | |||
| + | <code javascript> | ||
| + | const data = [ | ||
| + | { | ||
| + | name : ' | ||
| + | order : true, | ||
| + | items : [' | ||
| + | }, | ||
| + | { | ||
| + | name : ' | ||
| + | order : false, | ||
| + | } | ||
| + | ]; | ||
| + | |||
| + | const template = `< | ||
| + | console.log(template); | ||
| + | </ | ||
| + | |||
| + | === Tagged template literals === | ||
| + | |||
| + | <code javascript> | ||
| + | const data = [ | ||
| + | { | ||
| + | name : ' | ||
| + | order : true, | ||
| + | items : [' | ||
| + | }, | ||
| + | { | ||
| + | name : ' | ||
| + | order : false, | ||
| + | } | ||
| + | ]; | ||
| + | // Tagged template literals | ||
| + | function fn(tags, name, items) { | ||
| + | // | ||
| + | if(typeof items === " | ||
| + | items = " | ||
| + | } | ||
| + | return (tags[0] + name + tags[1] + items + tags[2]); | ||
| + | } | ||
| + | const template = fn`< | ||
| + | < | ||
| + | |||
| + | // | ||
| + | |||
| + | data.forEach(v => { | ||
| + | let template = fn`< | ||
| + | < | ||
| + | console.log(template); | ||
| + | document.querySelector('# | ||
| + | }); | ||
| + | </ | ||
| + | |||
| + | ==== Arrow Function ==== | ||
| + | |||
| + | <code javascript> | ||
| + | setTimeout(function(){ | ||
| + | console.log(" | ||
| + | }, 1000); | ||
| + | |||
| + | let newArr = [1, | ||
| + | return value * 2; | ||
| + | }); | ||
| + | |||
| + | let newArr3 = [1, | ||
| + | let newArr4 = [1, | ||
| + | </ | ||
| + | |||
| + | === this context of Arrow function === | ||
| + | <code javascript> | ||
| + | |||
| + | const myObj = { | ||
| + | runTimeout() { | ||
| + | setTimeout(function(){ | ||
| + | this.printData(); | ||
| + | // bind(this)를 통해서 myObj로 bind | ||
| + | }.bind(this), | ||
| + | }, | ||
| + | printData(){ | ||
| + | console.log(' | ||
| + | } | ||
| + | } | ||
| + | |||
| + | myObj.runTimeout(); | ||
| + | </ | ||
| + | == arrow function에서 this == | ||
| + | <code javascript> | ||
| + | const myObj = { | ||
| + | runTimeout() { | ||
| + | setTimeout(()=> | ||
| + | this.printData(); | ||
| + | }, 200); | ||
| + | }, | ||
| + | printData(){ | ||
| + | console.log(' | ||
| + | } | ||
| + | } | ||
| + | |||
| + | myObj.runTimeout(); | ||
| + | </ | ||
| + | == DOM Event도 같은 방식 == | ||
| + | <code javascript> | ||
| + | const el = document.querySelector(" | ||
| + | |||
| + | const myObj = { | ||
| + | register() { | ||
| + | el.addEventListener(" | ||
| + | this.printData(evt.target); | ||
| + | }); | ||
| + | }, | ||
| + | | ||
| + | printData(el) { | ||
| + | console.log(' | ||
| + | } | ||
| + | } | ||
| + | myObj.register(); | ||
| + | </ | ||
| + | |||
| + | ==== default parameters ==== | ||
| + | <code javascript> | ||
| + | function sum(value, size=1){ | ||
| + | return value * size; | ||
| + | } | ||
| + | |||
| + | console.log(sum(3)); | ||
| + | </ | ||
| + | |||
| + | === object === | ||
| + | <code javascript> | ||
| + | function sum(value, size={value: | ||
| + | return value * size.value; | ||
| + | } | ||
| + | |||
| + | console.log(3, | ||
| + | </ | ||
| + | |||
| + | ==== rest parameters ==== | ||
| + | <code javascript> | ||
| + | function checkNum(){ | ||
| + | const argArray = Array.prototype.slice.call(arguments); | ||
| + | console.log(argArray); | ||
| + | console.log(toString.call(arguments)); | ||
| + | const result = argArray.every((v) => typeof v === " | ||
| + | console.log(result); | ||
| + | } | ||
| + | |||
| + | const result = checkNum(10, | ||
| + | const result = checkNum(10, | ||
| + | </ | ||
| + | |||
| + | rest parameters | ||
| + | <code javascript> | ||
| + | function checkNum(...argArray){ | ||
| + | const result = argArray.every((v) => typeof v === " | ||
| + | console.log(result); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ===== ES6 class ===== | ||
| + | <code javascript> | ||
| + | function Health(name){ | ||
| + | this.name = name; | ||
| + | } | ||
| + | |||
| + | Health.prototype.showHealth = function(){ | ||
| + | console.log(this.name + "님 안녕하세요" | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== constructor ==== | ||
| + | <code javascript> | ||
| + | class Health { | ||
| + | constructor(name, | ||
| + | this.name = name; | ||
| + | this.lastTime = lastTime; | ||
| + | } | ||
| + | showHealth() { | ||
| + | console.log(" | ||
| + | } | ||
| + | } | ||
| + | |||
| + | const myHealth = new Health(" | ||
| + | </ | ||
| + | |||
| + | ==== Object assign 메서드 ==== | ||
| + | ES5에 추가됨 | ||
| + | <code javascript> | ||
| + | const healthObj = { | ||
| + | showHealth : function() { | ||
| + | console.log(" | ||
| + | } | ||
| + | } | ||
| + | |||
| + | const myHealth = Object.create(healthObj); | ||
| + | |||
| + | myHealth.healthTime = " | ||
| + | myHealth.name = " | ||
| + | |||
| + | console.log(myHealth); | ||
| + | </ | ||
| + | |||
| + | === Object Assign === | ||
| + | <code javascript> | ||
| + | const healthObj = { | ||
| + | showHealth : function() { | ||
| + | console.log(" | ||
| + | } | ||
| + | } | ||
| + | |||
| + | const myHealth = Object.assign(Object.create(healthObj), | ||
| + | name : " | ||
| + | lastTime : " | ||
| + | }); | ||
| + | |||
| + | myHealth.healthTime = " | ||
| + | myHealth.name = " | ||
| + | |||
| + | console.log(myHealth); | ||
| + | </ | ||
| + | |||
| + | === Object assign으로 immutable객체 만들기 === | ||
| + | <code javascript> | ||
| + | const previousObj = { | ||
| + | name : " | ||
| + | lastTime : " | ||
| + | } | ||
| + | |||
| + | const myHealth = Object.assign({}, | ||
| + | " | ||
| + | }); | ||
| + | |||
| + | console.log(" | ||
| + | </ | ||
| + | |||
| + | === setPrototypeOf === | ||
| + | 명확하고 단순한 것을 유지함. | ||
| + | <code javascript> | ||
| + | const healthObj = { | ||
| + | showHealth : function() { | ||
| + | console.log(" | ||
| + | } | ||
| + | } | ||
| + | const myHealth = { | ||
| + | name : " | ||
| + | lastTime : " | ||
| + | } | ||
| + | |||
| + | const newobj = Object.setPrototypeOf(myHealth, | ||
| + | console.log(" | ||
| + | |||
| + | console.log(" | ||
| + | </ | ||
| + | |||
| + | === Object setPrototypeOf로 객체간 prototype chain생성하기 === | ||
| + | <code javascript> | ||
| + | //parent | ||
| + | const healthObj = { | ||
| + | showHealth : function() { | ||
| + | console.log(" | ||
| + | }, | ||
| + | setHealth : function(newTime) { | ||
| + | this.healthTime = newTime; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // child obj | ||
| + | const healthChildObj = { | ||
| + | getAge : function() { | ||
| + | return this.age; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | const lastHealthObj = Object.setPrototypeOf(healthChildObj, | ||
| + | |||
| + | const childObj = Object.setPrototypeOf({ | ||
| + | age: 22 | ||
| + | }, healthChildObj); | ||
| + | |||
| + | console.log(" | ||
| + | </ | ||
| + | ==== Module(export & import)의 이해 ==== | ||
| + | |||
| + | 아직은 Browser 에서는 사용 못 하고 있음. | ||
| + | |||
| + | <code javascript app.js> | ||
| + | import log, { getTime, getCurrentHour } from ' | ||
| + | |||
| + | log(' | ||
| + | log(`getTime is ${getTime()}`); | ||
| + | log(`current hour is ${getCurrentHour()}`); | ||
| + | </ | ||
| + | |||
| + | <code javascript myLogger.js> | ||
| + | export function log(data){ | ||
| + | console.log(data); | ||
| + | } | ||
| + | |||
| + | export const getTime = () => { | ||
| + | return Date.now(); | ||
| + | } | ||
| + | |||
| + | export const getCurrentHour = () => { | ||
| + | return (new Date).getHours(); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ==== Proxy ==== | ||
| + | |||
| + | <code javascript> | ||
| + | const myObj = { name:' | ||
| + | const proxy = new Proxy(myObj, | ||
| + | get: function(target, | ||
| + | console.log(' | ||
| + | | ||
| + | // if(property in target) ... 없는 프러퍼티에 대해서 Error처리를 할 수 있다. | ||
| + | | ||
| + | //return target[property]; | ||
| + | return Reflect.get(target, | ||
| + | }, | ||
| + | set: function(target, | ||
| + | console.log(' | ||
| + | console.log(' | ||
| + | console.log(' | ||
| + | target[' | ||
| + | target[property] = value; | ||
| + | return true; | ||
| + | } | ||
| + | }); | ||
| + | |||
| + | console.log(' | ||
| + | console.log(' | ||
| + | proxy.name = ' | ||
| + | console.log(' | ||
| + | </ | ||
| + | ===== 기타정보들 ===== | ||
| + | ==== IIFE[Immediately Invoked Function Expression] ==== | ||
| + | “Iffy”라고 발음. | ||
| + | 즉시호출함수표현... | ||
| + | 기초 지식은 많이 있겠지만, | ||
| + | 또한 JavaScript에서는 function의 이름을 생략할 수 있다. | ||
| + | <code javascript> | ||
| + | (function(d){ | ||
| + | let myday = new Date(d); | ||
| + | myday.setFullYear(myday.getFullYear() + 1); | ||
| + | return myday; | ||
| + | })(' | ||
| + | </ | ||
| + | |||
| + | function f(a){ | ||
| + | asdfasdfgo 일... | ||
| + | } | ||
| + | ; | ||
| + | f(' | ||
| + | |||
| + | f( | ||
| + | (function(d){ | ||
| + | let myday = new Date(d); | ||
| + | myday.setFullYear(myday.getFullYear() + 1); | ||
| + | return myday; | ||
| + | })(' | ||
| + | ); | ||
| + | f(' | ||
| + | |||
| + | ==== About DATE ==== | ||
| + | === 날짜 포맷(yyyymmdd)출력하기(datepicker) === | ||
| + | <code javascript> | ||
| + | (function(p_date){ | ||
| + | let startDate = new Date(p_date); | ||
| + | startDate.setDate(startDate.getDate() + 1); | ||
| + | return $.datepicker.formatDate(' | ||
| + | })(" | ||
| + | </ | ||
| + | 말일 구하기 | ||
| + | <code javascript> | ||
| + | let lastday = new Date(day.substring(0, | ||
| + | return $.datepicker.formatDate(' | ||
| + | })(getStdDate()) | ||
| + | </ | ||
| + | === 날짜 더하기 === | ||
| + | <code javascript> | ||
| + | ((new Date()).getFullYear() + 1) + " | ||
| + | </ | ||
| + | |||
| + | === 요일명 === | ||
| + | <code javascript> | ||
| + | var d = new Date() | ||
| + | d.toLocaleDateString(' | ||
| + | </ | ||
| + | ==== 클로저(Closure) ==== | ||
| + | === jQuery에서 사용하는 클로저 === | ||
| + | <code javascript> | ||
| + | $(function() { | ||
| + | var selections = []; | ||
| + | $(" | ||
| + | selections.push(this.prop(" | ||
| + | }); | ||
| + | }); | ||
| + | </ | ||
| + | |||
| + | === Private구현방법. === | ||
| + | 예제는 더글라스 크락포드(Douglas Crockford)에 의해 처음 시연되었습니다: | ||
| + | <code javascript> | ||
| + | function celebrityID() { | ||
| + | var celebrityID = 999; | ||
| + | // 우리는 몇개의 내부 함수를 가진 객체를 리턴할것입니다. | ||
| + | // 모든 내부함수는 외부변수에 접근할 수 있습니다. | ||
| + | return { | ||
| + | getID: function() { | ||
| + | // 이 내부함수는 갱신된 celebrityID변수를 리턴합니다. | ||
| + | // 이것은 changeThdID함수가 값을 변경한 이후에도 celebrityID의 현재값을 리턴합니다. | ||
| + | return celebrityID; | ||
| + | }, | ||
| + | setID: function(theNewID) { | ||
| + | // 이 내부함수는 외부함수의 값을 언제든지 변경할 것입니다. | ||
| + | celebrityID = theNewID; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | var mjID = celebrityID(); | ||
| + | mjID.getID(); | ||
| + | mjID.setID(567); | ||
| + | mjID.getID(); | ||
| + | </ | ||
| + | |||
| + | === 비꼬기 === | ||
| + | 클로저가 갱신된 외부함수의 변수에 접근함으로써, | ||
| + | <code javascript> | ||
| + | function celebrityIDCreator(theCelebrities) { | ||
| + | var i; | ||
| + | var uniqueID = 100; | ||
| + | for (i=0; i< | ||
| + | theCelebrities[i][" | ||
| + | } | ||
| + | return theCelebrities; | ||
| + | } | ||
| + | |||
| + | var actionCelebs = [{name:" | ||
| + | var createIdForActionCelebs = celebrityIDCreator(actionCelebs); | ||
| + | var stalloneID = createIdForActionCelebs[0]; | ||
| + | console.log(stalloneID.id); | ||
| + | </ | ||
| + | 위의 예제에서, | ||
| + | |||
| + | 이런 결과가 나타난 이유는, 앞서 언급했듯이 클로저는(이 예제에서 내부의 익명함수) 외부 변수에 대해 값이 아닌 참조로 접근하기 때문입니다. 즉, 클로저는 최종 갱신된 변수(i)에 대해서만 접근할 수 있으므로, | ||
| + | === IIFE사용하여 수정하기 === | ||
| + | 이런 부작용을 고치기 위해서 “즉시 호출된 함수 표현식(Immediately Invoked Function Expression. IIFE)”를 사용할 수 있습니다. | ||
| + | <code javascript> | ||
| + | function celebrityIDCreator(theCelebrities) { | ||
| + | var i; | ||
| + | var uniqueID = 100; | ||
| + | for (i=0; i< | ||
| + | theCelebrities[i][" | ||
| + | // j 파라미터는 호출시 즉시 넘겨받은(IIFE) i의 값이 됩니다. | ||
| + | return function() { | ||
| + | // for문이 순환할때마다 현재 i의 값을 넘겨주고, | ||
| + | return uniqueID + j; | ||
| + | } () // 함수의 마지막에 ()를 추가함으로써 함수를 리턴하는 대신 함수를 즉시 실행하고 그 결과값을 리턴합니다. | ||
| + | } (i); // i 변수를 파라미터로 즉시 함수를 호출합니다. | ||
| + | } | ||
| + | return theCelebrities; | ||
| + | } | ||
| + | var actionCelebs = [{name:" | ||
| + | var createIdForActionCelebs = celebrityIDCreator(actionCelebs); | ||
| + | var stalloneID = createIdForActionCelebs[0]; | ||
| + | console.log(stalloneID.id); | ||
| + | var cruiseID = createIdForActionCelebs[1]; | ||
| + | console.log(cruiseID.id); | ||
| + | </ | ||
| + | |||
| + | ==== 화살표함수와 this ==== | ||
| + | ES5에서 가장 헷갈리는것이 바로 this의 범위이다. 클로저가 생성한 컨텍스트로 인해 this가 this가 아닌 상황이 발생하여 “that = this, self = this”와 같은 패턴을 사용해야만 했다. | ||
| + | <code javascript> | ||
| + | var self = this | ||
| + | $(' | ||
| + | self.sendData() | ||
| + | }) | ||
| + | </ | ||
| + | 또는 “.bind(this)”를 사용해 this를 현재 컨텍스트와 수동으로 바인딩하기도 했었다. | ||
| + | <code javascript> | ||
| + | $(' | ||
| + | this.sendData() | ||
| + | }.bind(this)) | ||
| + | </ | ||
| + | 화살표 함수를 사용하면 이러한 번거로움을 해소할 수 있다. | ||
| + | <code javascript> | ||
| + | $(' | ||
| + | this.sendData() | ||
| + | }) | ||
| + | </ | ||
| + | 화살표 함수는 함수 표현식을 간략하게 표기하도록도 해주지만 this의 범위를 함수를 감싸는 코드와 동일하게 유지해줌으로써 기존의 클로저로 인한 번거로움을 많이 해소해 준다. | ||
| + | |||
| + | {{http:// | ||
| + | |||