본문 바로가기

전체 글131

[Javascript] List/Set/ Map 순회하기 기본적으로 리스트를 순회하는 방법은 이렇다. const list = [1, 2, 3]; for (var i = 0 ; i < list.length ; i++){ console.log(list[i]); } index를 쓰지 않고 of를 사용할 수도 있다. const list = [1,2,3] for(const item of list){ console.log(item); } for (const a of arr) console.log(a); // inline으로 쓸 수도 있다. [대괄호]로 선언해서 배열을 만들 수도 있지만, Set이나 Map으로 순회가능한 객체를 만들수도 있다. const set = new Set([1,2,3]); const map = new Map([['a', 1],['b', 2],['c'.. 2020. 2. 9.
[Javascript] 함수와 일급객체, 고차함수와 클로저 일급객체란? 1) 값으로 사용될 수 있고 2) 변수에 할당할 수 있고 3) 함수의 리턴값으로 사용할 수 있고 4) 함수의 인자로 전달할 수 있는 객체를 말한다. javascript에서 함수는 일급객체이다. 따라서 1) 함수를 값으로 사용할 수 있고 2) 함수를 변수에 할당할 수 있고 3) 함수의 리턴값으로 함수를 사용할 수 있고 4) 함수의 인자로도 함수를 전달할 수 있다. 고차함수 함수를 값으로 다룰 수 있다는 의미는 고차함수를 사용할 수 있다는 의미이기도 하다. 고차함수란 함수가 함수를 인자로 받는 것을 말한다. const test = f ⇒ f(1); /** * 익명함수(f => f(1))를 test 변수에 할당했다. * 함수의 인자로 함수를 전달했다(f) * 이 함수는 함수를 인자로 받아 1을 인.. 2020. 2. 6.
Error: listen EADDRINUSE: address already in use :::3001 Error: listen EADDRINUSE: address already in use :::3001 서버를 띄웠을때 이런 에러 메시지가 뜨면, 같은 포트에 종료안한 서버가 띄워져있어서 그런 것이다. 포트를 바꾸거나 터미널에서 찾아서 kill 하면 된다. $ lsof -wni tcp:3001 // 현재 3001 포트에 실행중인 내용을 보여준다. COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME node 16426 effy 22u IPv6 - 0t0 TCP *:redwood-broker (LISTEN) $ kill 16426 // kill [PID] 명령어 설명 lsof(LiSt Open Files) : 현재 시스템에 열려있는 파일, 그 파일을 사용중인 프로세스 목.. 2020. 2. 5.
Express의 오류 처리 http://expressjs.com/ko/guide/error-handling.html Express 오류 처리 오류 처리 다른 미들웨어 함수와 동일반 방법으로 오류 처리 미들웨어 함수를 정의할 수 있지만, 오류 처리 함수는 3개가 아닌 4개의 인수, 즉 (err, req, res, next)를 갖는다는 점이 다릅니다. 예를 들면 다음과 같습니다. app.use(function(err, req, res, next) { console.error(err.stack); res.status(500).send('Something broke!'); }); 오류 처리 미들웨어는 expressjs.com Express Document를 읽고 알게 된 사항을 정리함. app.use와 app.post 등등의 차이점 ap.. 2020. 1. 31.
map 안에서 async/await 사용시 Promise가 리턴되는 문제 const arr = [1,2,3,4]; const result = arr.map(async (item) => { await sampleFunction(item); }) function sampleFunction(item) { return item + 1; } console.log(result); // [2, 3, 4, 5]를 리턴할 것 같지만 /** [ Promise { }, Promise { }, Promise { }, Promise { } ] 를 리턴한다. */ map 안에서 async/await을 사용했을 때, return값으로 Promise { pending } 이 들어오는 문제가 생긴다. .map은 내부적으로 단순하게 아래 코드와 같다고 생각하면 된다. const result = []; for.. 2020. 1. 23.
[Javascript] 특정 문자열 잘라내기 특정 문자열을 잘라내야 할 경우가 있다. 예를 들면, 메일의 자동 발송을 고려하여 고객명을 아래와 같이 DB에 저장해두었다고 하자. 홍길동 부장님 귀하 홍길동 귀하 홍길동님 귀하 이런식으로 작성하다가, 자동으로 템플릿에 귀하를 추가해주게 된 것이다. 그러면 기존 데이터의 귀하를 제거해야 한다. 그런 경우 아래와 같이 해주면 const arr = ['홍길동 귀하', '홍길동 부장님 귀하', '홍길동님 귀하'] for (item of arr) { const index = item.indexOf(' 귀하'); if (index > 0 && index+3 === item.length){ // '귀하'가 존재하고, 가장 마지막에 있을 때만 const result = item.slice(0, -3); console.. 2020. 1. 23.
Refactoring - Replace Function with Command Martin Fowler - Refactoring을 읽고 정리한 글입니다.(337~343p) // Before function score(candidate, medicalExam, scoringGuide) { let result = 0; let healthLevel = 0; // long body code } // After class Scrorer { constructor(candidate, medicatExam, scroingGuide) { this._candidate = candidate; this._medicalExam = medicalExam; this._scoringGuide = scoringGuide; } execute() { this._result = 0; this._healthLevel .. 2020. 1. 2.
Refactoring - Introduce Assertion Martin Fowler - Refactoring을 읽고 정리한 글입니다.(302~304p) // Before if (this.discountRate) base = base - (this.discountRate * base); // After assert(this.discountRate >= 0); // assert 추가 if (this.discountRate) base = base - (this.discountRate * base); 예제는 할인하는 코드. 만약에 discountRate가 0이면 할인이 안됨. Motivation 특정 조건을 만족시켜야 동작하는 코드가 있을 때 추론하기보다는 어썰션이 있으면 좋다. 어썰션은 항상 참일 것을로 추정되는 컨디셔널 스테이트먼트다. 실패하면 에러를 일으킨다. 어.. 2019. 12. 31.
Refactoring - Decompose Conditional Martin Fowler - Refactoring을 읽고 정리한 글입니다.(260~262p) // Before if (!aDate.isBefore(plan.summerStart) && !aDate.isAfter(plan.summerEnd)) charge = quantity * plan.summerRate; else charge = quantity * plan.regularRate + plan.regularServiceCharge; // After if (summer()) charge = summerCharge(); else charge = regularCharge() 조건문 분해. 프로그램의 복잡도를 올리는 가장 흔한 요소는 조건부 로직이다. 다양한 조건의 코드를 쓰면 함수는 길어져도 빨리 끝낼 수 있다.. 2019. 12. 31.