Today, I Leanred

  • 절차형 프로그래밍 vs 선언형 프로그래밍 : 그저께 배웠던 추상화와 연관시켜 설명가능 => 절차형 프로그래밍이 하나하나 구체적으로 '절차' 혹은 'how to do it'을 명시해주는 프로그래밍이라면, 즉, 그것을 이해하려면, 하나하나 그 과정을 따라가면서 아 이렇게 되고, 이렇게 되는구나 하는 식이라면, 선언형 프로그래밍은 그 구체적인 과정을 추상화하여, 결론적으로 '무엇을', 'what to do'를 명시해주는 프로그래밍이다. map, filter 등의 메서드는 그 속에 어떤 로직이 있는지 우리가 알 필요가 없이, map, filter가 뭐를 해준다는 것만 알고 있으면 우리는 특정 코드가 'what to do', 즉, 무엇을 하는 코드인지 좀 더 가독성 좋게 파악할 수 있다(하나하나 로직을 따라가보지 않아도) (**선언형 방식의 장점 : 가독성이 좋고, 재사용하기가 쉽다. filter 등을 생각해보면, 그안의 로직만 우리가 추상화해놓는다면, 후에는 filter만 가져다 쓰면 되기 때문! 그러나, 절차형은 매번 그 로직을 하나하나 구현해야함!)
  • 결론 : 고도의 추상화 => '선언형 프로그래밍' + filter, map, reduce 등의 메서드를 for문으로 하나하나 구현해서 쓰는 것과 그대로 가져다 쓰는 것의 차이에서 선언형과 절차형의 차이를 알 수 있다는 점 알아두자.
  • 화살표 함수 '=>'
  • currying vs closure :
    #currying : A function is said to be curried when all the arguments needed for its invocation have not been supplied.
    #closure : reference to a variable declared in the scope of another function that is kept alive by returning a new function from the invocation of the existing function.
  • this를 원하는 객체와 바인딩시키고자 할 때 : apply(), call() 메서드를 사용한다 :
    먼저, apply()메서드는 '함수.apply(함수 안의 this에 바인딩시킬 객체, 함수의 인자로 줄 매개변수)' 형태로 사용한다. 이렇게 하면, 예를 들어, arguments 객체(유사배열 객체)에 배열이 쓸 수 있는 메서드를 쓸 수 있게 된다.
    ex] Array.prototype.slice.apply(arguments);
    이렇게 해주면, slice 메서드를 호출하면서, 그 안의 로직에서 this를 arguments 객체와 바인딩시키고, 결국, arguments 객체의 요소와 같은 배열을 리턴해준다(slice에 인자를 안넣어줬기에)
    call 메서드는 apply() 메서드와 같지만, 뒤에 함수에 넣어주는 인자부분이 배열 형태로 넣는 것이 아닌 '요소1,요소2,...' 이런식으로 넣어주는게 다르다.
  • 일반 함수는 디폴트로 undefined를 리턴하지만, 생성자 함수는 디폴트로 생성한 객체를 리턴한다. 그러나, 이 때, return 값을 임의로 다른 객체로 주면 그 객체가 리턴됨(** 이 때, 객체가 아닌 문자열, boolean 타입 등의 값을 리턴하면 디폴트 값이 리턴됨)
  • 모든 자바스크립트 객체는 생성시에 '_proto_' 프로퍼티, 즉, 프로토타입 객체(부모 객체)를 가지고 생성됨. 그리고, 자식 객체는 부모 객체의 속성 및 메서드를 상속받아 쓸 수 있음. 이 때, 생성자 함수로 객체를 생성할 경우 특별하게, '_proto_' 프로퍼티가 부모 객체(생성자 함수)의 복사본, 즉, 생성자 함수의 prototype property를 참조하게 됨. 우리가 아는 'Array.prototype'도 Array 생성자 함수의 prototype 프로퍼티이고, 이 프로토타입 프로퍼티는 constructor 속성만을 가지고 있음. 이 때, constructor 프로퍼티는 역으로 생성자 함수를 참조함(서로 참조하는 관계) + 이 프로토타입 프로퍼티 역시 하나의 객체이기에 Object.prototype을 '_proto_' 프로퍼티로 참조함.
  • 그리고 위와 같은 부모 객체의 속성, 메서드를 자식 객체가 상속할 때, 차례대로 조상(?)을 따라서 올라가면서 속성 혹은 메서드가 있는지 찾는 과정을 프로토타입 체이닝이라고 함.
  • 마지막으로 우리는 Array.prototype or String.prototype 등의 객체에 우리가 원하는 속성, 메서드를 추가할 수 있고, 이는 결과적으로 이 프로토타입 객체를 상속받는 모든 객체가 쓸 수 있도록 할 수 있음. 예를 들어,
    String.prototype.name = 'string';
    을 해놓으면,
    let str = 'my name is';
    console.log(str.name);
    출력 : string

Planning to Study

  • 아직 이전 planning to study 것을 다 못했기에 오늘은 pass!
profile
완벽함 보다는 최선의 결과를 위해 끊임없이 노력하는 개발자

0개의 댓글