객체 원시형 형변환

lee jae hwan·2022년 7월 22일

javascript

목록 보기
13/107

객체도 연산 및 인자로 사용될때 암시적형변환이 발생할 수 있다.
객체가 원시형으로 형변환되는 절차를 알아보자

객체가 Boolean형으로 변환되어야 한다면 객체는 무조건 true로 변환된다.
그렇다면 문자열과 숫자로의 형변환만 생각하면 된다.

  1. 객체에 obj[Symbol.toPrimitive](hint)메서드가 있다면 호출된다.
let user = {
  name:'lee',
  age:45,
  [Symbol.toPrimitive](hint){ // default
    return (hint!='number')?`${this.name}`:this.age;
  }
}
console.log( user + '_' );

Symbol.toPrimitive메소드를 정의하면 형변환시 자동 호출된다.

  1. 위 메소드가 정의되어있지 않고 문자열로 형변환되어야 한다면
    user.toString() -> user.valueOf() 순으로 호출된다.

  2. 숫자형으로 형변환되어야 한다면
    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) );은 전달받은 것을 문자열로 출력하는 기능의 메소드를 호출한 것이다.
형변환과 관계가 없는 것이다.

0개의 댓글