객체도 연산 및 인자로 사용될때 암시적형변환이 발생할 수 있다.
객체가 원시형으로 형변환되는 절차를 알아보자
객체가 Boolean형으로 변환되어야 한다면 객체는 무조건 true로 변환된다.
그렇다면 문자열과 숫자로의 형변환만 생각하면 된다.
let user = {
name:'lee',
age:45,
[Symbol.toPrimitive](hint){ // default
return (hint!='number')?`${this.name}`:this.age;
}
}
console.log( user + '_' );
Symbol.toPrimitive메소드를 정의하면 형변환시 자동 호출된다.
위 메소드가 정의되어있지 않고 문자열로 형변환되어야 한다면
user.toString() -> user.valueOf() 순으로 호출된다.
숫자형으로 형변환되어야 한다면
user.valueOf() -> user.toString()을 호출된다.
let user = {name: "John"};
alert(user);
alert함수는 전달된 매개변수를 문자열로 변환한다.
심볼메소드가 정의되어있지 않고 문자열로 변환되어야 하므로 user.toString()이 먼저 호출되고 toString메소드가 없다면 user.valueOf()이 호출될것이다.
user에 toString메소드가 없으므로 상위객체 Object.prototype.toString메소드가 호출되며 이것은 [object type]문자열을 반환하도록 되어있어 user의 type은 Object이므로 [object Object]문자열이 되는 것이다.
let book = {
cost:50
}
객체가 숫자형으로 변환되어야 하는데 객체에 valueOf메소드가 오버라이딩되어있지 않으면 Object.prototype.valueOf가 호출되는데 이것은 {cost:50}와 같이 객체전체를 문자열로 반환한다. 따라서 객체에 valueOf메소드를 오버라이딩해야 한다.
let book = {
cost:50,
valueOf(){
return this.cost;
}
}
let user = {
'name':'lee',
[Symbol.toPrimitive](hint){
return hint!='number'?this.name:this.age;
}
};
console.log( user + '_' );
console.log( Object.prototype.toString.call(user) );
console.log( user.toString() );
console.log( user + '_' );은 확실히 문자열로 형변환된다.
console.log( user.toString() );은 형변환이 아니고 있는 메소드를 호출하는 것이다. 결과값은 정해진 코드대로 반환되는 것이다.
console.log( Object.prototype.toString.call(user) );은 전달받은 것을 문자열로 출력하는 기능의 메소드를 호출한 것이다.
형변환과 관계가 없는 것이다.