함수 toString

lee jae hwan·2022년 7월 25일

javascript

목록 보기
37/107

객체가 원시값으로 암시적이든지 명시적이든지 형변환되어야 한다면 Symbol.toPrimitive메소드를 추가하거나 toString, valueOf메소드를 오버라이딩해야 한다.

그렇지 않으면 Object.toString, Object.valueOf메소드가 호출된다.

함수도 객체이기때문에 위규칙에 따른다.

function sum(){}
sum.toString = function(){
  return '1';
}
let a = Object.prototype.toString.call(sum);
console.log(sum+'_'+a); // 1_[object Function]

sum함수는 Function클래스의 객체고 Function클래스는 Object클래스의 하위클래스다.
만약 Function클래스에 toString이 정의되어있지 않다면 위와 같이 [object Function]문자열이 출력된다.

function sum(num1,num2){
    return num1+num2;
}
console.log(sum.toString()); // 함수를 문자열로 반환한다
console.log(sum.valueOf()); // 함수를 반환한다

console.log(sum.valueOf()(1,2)); // 3

Function클래스에 toString, valueOf메소드가 위와같이 오버라이딩되어있다.

sum함수도 객체이므로 sum함수에 toString메소드를 추가하면 암시적형변환이 필요하면 추가한 메소드가 호출될것이다.



function sum(arg){
  let totalSum=arg;
  function fn(arg1){
      totalSum+=arg1;
      return fn;
  }    
  fn.toString=function(){
    console.log('toString');
      return totalSum;
  };
  fn.valueOf=function(){
    console.log('valueof');
    return totalSum;
  };
  return fn;
}

반환함수에 toString메소드를 추가해서 반환한다.

sum(1)(2);  // 3이 반환되길 기대하는가?
sum(1)(2)(3);  // 6이 반환되길 기대하는가?

위코드는 함수를 반환하기때문에 기대하는 연산결과가 반환되지 않는다.
함수객체가 원시값으로 형변환이 발생되는 조건에서 연산결과값을 반환한다.

alert( sum(1)(2) ); // 암시적형변환 : 원시값 문자열로 변환된다.
console.log( sum(1)(2) == 3 ); // 암시적형변환 숫자로변환

sum(1)(2) == 3;
타입이 다를때 비교연산은 숫자로 형변환후 비교된다.

sum(1)(2)이 숫자로 형변환된다. valueOf() -> toString()으로 호출된것이다.

둘다 정의되어있지 않으면 Object.valueOf()->Object.toString()으로 호출될것이다.

0개의 댓글