Jan 11, 2018 - codespitz73_part2

코드스피츠73 part2

흐름제어

LABEL, BREAK, CONTINUE

LABEL은 변수의 식별자와 같다.

레이블 레인지가 가르치는 곳으로 갈수있다.

레이블을 주석 형태로도 쓸수 있다.


const con = document.getElementById("log");

const log = (...args) => con.innerHTML += '<br/>' + args.join(' ');

abc:() => {
    
    abc:{
        
    }
}


레이블 점프


const con = document.getElementById("log");

const log = (...args) => con.innerHTML += '<br/>' + args.join(' ');

for(const i of [1,2,3,4]){
    // 레이블 이름을 정하지 않아도 점프가 가능 자동으로 레이블을 만듬
    if(i === 3) break;
    log(i);
}

//에러가 나옴 레이블을 명시하지 않아서
abc: {
    log('a');
    break;
    log('b');
}
log('c');

// 에러가 안됨 현대에 언어에는 아래로만 점프가 가능
abc: {
    log('a');
    break abc;
    log('b');
}
log('c');

function scope

클로저에 대한 설명

const con = document.getElementById("log");
const log = (...args) => con.innerHTML += '<br/>' + args.join(' ');
//자유변수
let a = 3;
// a 자유변수에 대한 클로저
const  f = () => {
    // 쉐도잉
    let a = 5;
    log(a);  
};

레이블 스코프

const con = document.getElementById("log");
const log = (...args) => con.innerHTML += '<br/>' + args.join(' ');

k1:{
    let a = 3;
    const  f = () => {
        let a = 5;
        k:{
            //레이블 스코프 찾을수 없다 에러가 남
            break k1;
            log(37);
        }
        log(a);
    };
    f();
}

switch 문

const con = document.getElementById("log");
const log = (...args) => con.innerHTML += '<br/>' + args.join(' ');
// 스위치 문에 블럭은 꼭 선언해야 된다.
// 스위치 문에는 특수 레이블을 사용한다.
// 스위치 문에서 익명 레이블을 만들어준다
// 스위치 문에 레이블도 선언해서 쓸수 있다.

let a = 3, b= 0;

// 값이 복잡한 경우
switch (a) {
    case b++: log('a',b);break;
    case b++: log('b',b);break;
    case b++: log('c',b);break;
    case b++: log('d',b);break;
    default: log('e',b);break;           
}

// 조건이 복잡한 경우
switch (true) {
    case a>5: log('a',b);break;
    case a>4: log('b',b);break;
    case a>3: log('c',b);break;
    case a>2: log('d',b);break;
    default: log('e',b);break;           
}

스위치 문에는 반드시 default가 있다.

if문

a:const  c = 3;
if() 옵션널
if() 
else 필수


a:const  c = 3;
if( c === 1){
    
} else if (c === 2){
    
} else if (c === 3){
    
}else{
    
}

else if문은 없다. else 후방 결합을 사용하지 말아라

병렬 조건을 사용할때 else if를 사용하지말아라

1차 조건이 분기한 이후에 부분집합에 분기가 필요할때만 사용해라


a:const  c = 3;
if( c === 1){
    
} else {
    if (c === 2){
        
    } else {
        if (c === 3){
               
        }else{
            
        }    
    }
}  

else 문 후방결합에 따라서 아래 방식대로 사용가능하다.


a:const  c = 3;
if( c === 1){
    
} else for(;;;) {
    
} else switch (){
    
} else {
    
}

코드의 부수효과 else를 제거 하면서 필수 조건이 빠지면 안된다. else를 사용하면 필수로 가는것을 추천하라


a:const  c = 3;
if( c === 1){
    
} else {
    if (c === 2){
        
    } else {
        if (c === 3){
               
        }    
    }
}  

for 문

for문에 첫번째 인자만 식과 선언문이 들어 올수 있다.


const con = document.getElementById("log");
const log = (...args) => con.innerHTML += '<br/>' + args.join(' ');

var a = 3;

// for(선언문 또는 식 또는 공문; truthy ; for문에 맨마지막에 실행된다.){
    
 '', false, 0, undefined, null, NaN, // falsy 값   

// }

// 무한 루프 가운데 값을 공문으로 채우면 truthy로 판단함 예외사항
for(; ; ){
    
}

// 에러가 남 
while (){
    
}

// 한번은 먼저 실행해야 되는경우에 많이 사용
do {
    
}while ()

쉬운 문장


var a = -1;

while (a > 2){
    a++;
}


do {
    
}while (truthy);

do a++; while (a);

아래의 코드는 배재함


while (act.method().c){
    other.action();
}


이런식으로 보이게 만들어라


var a = act.method().c;
while (a){
    other.action();
    a = act.method().c;
}


아래 처럼 테스트 코드 작성 하기 편함


var a = act.method().c;
while (a) {
    let r  = other.action();
    a = act.method().c;
    if(r === 'abc') a = false;
}

어렵다. 오늘도…

참조


Jan 11, 2018 - CodeSpitz74_Part2

코드스피츠 74 2회차

함수를 작성할때에 참조에 대해서 충분히 고민해야 된다.

참조를 인자로 보내면 위험하다.

call 스택 -> 지역변수, 인자, 함수의 참조주소

tail recursion(꼬리물기 최적화) -> 메모리 고갈을 방지함 -> 자바스크립트는 ES6에 표준(사파리에서만 작동)


// 연산스택 때문에 스택을 해제 할수 없다.(+)
const sum = v => v + (v>1 ? sum(v-1) : 0);

sum(3);


// 인자로 이관해서 꼬리 물기 최적화
const sum = (v, prev = 0 )=> {
    prev +=v;
    return (v>1 ? sum(v-1,prev) : prev);
}; 

sum(3);


// 재귀함수는 먼저 꼬리물기 최적화로 바꿈 loop로 빠꿈
const sum = (v)=> {
    let prev +=v;
    while (v>1){
        prev += v;
        v--;
    }
    return prev;
}; 

sum(3);

위에 까지는 정적함수 개념을 배운것

closure

자유변수 : free variables 루틴안에 있는 지역변수도 아니고 글로벌 변수도 아닌데 사용할수 있음

nested closure(중첩된 클로저)


window.a =3;
if(a == 3){
    const b= 5;
    const f1 = v =>{
        const c = 8;
        if(a+b>c){
            return p => v + p + a + b + c;
        }else{
            return p => v + p + a + b;            
        }
    };
}

자유변수를 쓰는 이유는 함수자체에서 제공 받는 객체가 필요해서 사용한다.

shadowing(클로저에서 자유변수로 접근을 막기 위해서 사용한다.)


const a =3;
if(a == 3){
    const a =5;
    const f1 = v=>{
        const a = 7;
        console.log(a);
    }
}

co routine(여러번 진입하고 반환하는 것)

메모리 지속을 위해서 코루틴을 사용.

절차가 중요한것에서 사용함


const generator = function*(a) {
  a++;
  yield a;
  a++;
  yield a;
  a++;
  yield a;
};

const coroutine = generator(3);
let result = 0;
result+= coroutine.next().value;
console.log(result);
result+= coroutine.next().value;
console.log(result);
result+= coroutine.next().value;
console.log(result);

//축약을 위해 아래처럼 사용되기도 함
const a = {*_(){}};
const b = a._();

숙제 es6에서 진짜 배열을 상속 받아서 구현 할수 있는이유 super 있어서


class TestArray extends Array {
    constructor(...args) { 
        super(...args);
    }
}

const a = new TestArray(2);

console.log(a.length);

//배열 연산자를 뺄수 있는 경우가 ㅜㅜ
function TestArray(...args) {
    var inst = new Array(...args);
    inst.__proto__ = TestArray.prototype;
    return inst;
}

TestArray.prototype = Object.create(Array.prototype);
var a = new TestArray('1','2');
console.log(a.length);

기존 프로토타입 체인으로 어떻게 될지 잘모르니 좌절 사람들 설명을 보고 나서 대충 감이…

어렵다 ㅜㅜ

참조


Jan 11, 2018 - _termvectors

inverted index

elasticsearch를 사용해 키워드 검색을 활용해서 서비스를 만들려고 할때 은전한닢(오픈소스 한국어 형태소 분석기)을 통해 인덱스를 만들어서 검색을 활용하고 있는데 만들어진 인덱스에 term(token)을 검색해야 될일이 생겨서 검색하는 찾았다.

GET /twitter/tweet/1/_termvectors

GET /twitter/tweet/1/_termvectors?fields=message

위에 형태되로 하면 되었다 logstash DB에 있는 값을 넣었는데 id를 직접 지정하지 않았다. 그래서 해당 id를 검색하려고 아래의 쿼리를 실행시켜서 요청을 했다.

# 인덱스 조회

GET _cat/indices?v&pretty

GET /인덱스명/_search
{
  "query": {
    "match": {"pnm":"바지"}
  }
}

GET 인덱스명/타입명/_id/_termvectors?fields=필드명

한번에 모든 term값을 가지고 오고 싶었는데 아래 discuss.elastic링크에서 보면 해당 값을 가지고 올수있는 api 제공되지 않는다고 한다.

참조