Symbol.toPrimitive를 이용한 객체의 원시값 변환 제어

객체 자체에 대한 적절한 원시값으로 변환하고자 할때 Symbol.toPrimitive가 매우 유용하게 사용될 수 있습니다.

다음과 같은 코드가 있다면 …

const money = {
    amount: 1000,

    [Symbol.toPrimitive](hint) {
        if (hint === "number") {
            return this.amount;
        }

        return `${this.amount}원`;
    }
};

위의 money에 대해 다음 코드를 실행해 보면 상황에 맞게 해당 객체가 알맞은 원시값으로 변환되어 사용됩니다.

console.log(+money);     // 1000
console.log(`${money}`); // 1000원

Symbol.iterator를 이용한 for … of 지원하기

데이터를 가지고 있는 컨테이너 객체에 대해 for … of 를 지원하기 위해서는 Symbol.iterator가 필요합니다.

예를들어 1, 2, 3 데이터를 가지고 있는 다음과 같은 객체가 있다고 할때 for … of로 데이터를 순회한다면 참 직관적입니다.

const numbers = {
    data: [1, 2, 3]
};

for (const n of numbers) {
    console.log(n);
}

위의 코드가 실행될 수 있으려면 다음과 같은 코드를 추가해야 합니다.

const numbers = {
    data: [1, 2, 3],

    [Symbol.iterator]() {
        let index = 0;
        const data = this.data;

        return {
            next() {
                if (index < data.length) {
                    return {
                        value: data[index++],
                        done: false
                    };
                }

                return {
                    done: true
                };
            }
        };
    }
};