본문 바로가기

개인공부

2021년 4월 24일 TIL(koans 복습, 깊은 고찰: arguments.callee, 부족한 점 )

반응형

koans 복습

 

알게된 점

 

  • 임의의 객체 obj에 obj.length는 undefined를 return한다.
  • object method는 객체의 속성으로 정의된 함수.
  • this는 method를 호출한 시점에 method를 호출한 객체
array.porototype.slice : 얕은 복사(중첩 구조 복사 X)
Spread Operator(펼침 연산자) : 얕은 복사(중첩 구조 복사 X)
Object.assign : 얕은 복사(중첩 구조 복사 X)
JSON.parse(JSON.stringify(arr)) : 깊은 복사는 아니지만 깊은 복사하는 방식처럼 보인다. (중첩 구조 복사 O)

 

깊은 고찰

 

 

spread syntax를 통한 rest parameter는

function getAllParamsByRestParameter(...args) {
      return args;
    }

typeof 시 'object'

Array.isArray() 시 true

 

arguments를 통해 함수의 인자를 다룰 경우는

    function getAllParamsByArgumentsObj() {
      return arguments;
    }

typeof 시 'object'

Array.isArray() 시 false

 

Array.isArray()에서 두가지의 경우는 차이를 보이지만,

둘 다 Object.keys() / Object.values()를 사용 가능.

 

arguments를 통해 함수의 인자를 다룰 경우 Array.isArray()에서 false를 return함을 알 수 있었지만, 

이것도 Array.from()을 통해 배열로 만들 수가 있으며 이 경우 Array.isArray()에서 true를 리턴하게 만든다.

 

이와중에 또 궁금한게 생겨났다.

 

위 spread syntax로 그리고 arguments로 함수를 만들어 그 결과값을 변수에 담아주고 그 변수를 리턴했을 때의 값에 차이(callee)가 있었는데 그게 무엇인지 보자.

 

    const restParams = getAllParamsByRestParameter('first', 'second', 'third');
    
    restParams
	(3) ["first", "second", "third"]

    const argumentsObj = getAllParamsByArgumentsObj('first', 'second', 'third');
    
    argumentsObj
	Arguments(3) ["first", "second", "third", callee: ƒ, Symbol(Symbol.iterator): ƒ]
	//callee와 Symbol은 무엇일까.

	argumentsObj.length
	3
	//callee와 Symbol은 length에 포함되지 않음을 알 수 있다. 

 

callee

 

arguments.callee - JavaScript | MDN

arguments.callee arguments.callee 속성(property)은 현재 실행 중인 함수를 포함합니다. callee는 arguments 객체의 속성입니다. 그 함수의 몸통(body) 내에서 현재 실행 중인 함수를 참조하는 데 쓰일 수 있습니

developer.mozilla.org

callee는 arguments 객체의 속성입니다.

그 함수의 몸통(body)({}) 내에서 현재 실행 중인 함수를 참조하는 데 쓰일 수 있습니다. 이는 함수의 이름을 알 수 없는 경우에 유용합니다, 가령 이름 없는 함수 식(또한 "익명 함수"라 함) 내에서.
function create() {
   return function(n) {
      if (n <= 1)
         return 1;
      return n * arguments.callee(n - 1);
   };
}

var result = create()(5); // 반환값 120 (5 * 4 * 3 * 2 * 1)

//예시는 MDN을 참고하였습니다.

나머지 예시들은 너무 어려웠는데 이 예시만은 이해할 수 있었다. 

여기서 arguments.callee(n-1)은 함수 create가 리턴하는 익명함수 인 것이다.

(그러므로 n이 1과 같아질 때까지 순환하는 구조가 된다. 마치 반복문 같다.)

 

koans를 통해 알게된 부족한 점

 

객체를 그래도 조금은 안다고 생각했지만 객체에 대한 이해가 적었음.

spread문법과 rest문법에 대한 이해가 적었음.

배열과 객체에서의 destructing assignment를 비교해 봐야함.

 

미리 맛본 고차함수 : 

함수를 리턴하는 함수(혹은 화살표를 연달아 쓴다면)

중복되는 부분과 다른 부분들 중 다른부분은 매개변수로 바꾸고 함수가 함수를 리턴하는 방식으로 바꾼다면

고차함수를 통해서 중복을 제거할 수 있다. 

 

반응형