객체가 원시값으로 암시적이든지 명시적이든지 형변환되어야 한다면 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()으로 호출될것이다.