Подтвердить что ты не робот

Symbol.toPrimitive vs Object.prototype.valueOf

В ECMAScript 6 вводится новый символ Symbol.toPrimitive, который при использовании в качестве ключевого объекта должен определять функцию для возврата примитивное значение объекта:

let object = {
    aNumber: 0,
    [Symbol.toPrimitive]() {
        return this.aNumber;
    }
};

object.aNumber = 5;
console.log(object + 2) // 7

Однако существует также функция Object.prototype.valueOf, которая, в соответствии с документацией, может быть переопределена для преобразования объекта в примитив значение:

let object = {
    aNumber: 0,
    valueOf() {
        return this.aNumber;
    }
};

object.aNumber = 5;
console.log(object + 2) // 7

Итак, какой из этих способов преобразования объекта в его примитивное значение следует использовать в ES6 при определении нового объекта?

4b9b3361

Ответ 1

Основной целью Symbol.toPrimitive является изменение порядка, в котором toString и valueOf вызываются в разных сценариях принуждения.

Примером этого является собственный объект Date, где он по умолчанию преобразует значение в строку, а не число:

console.log(1 + new Date()); // "1Mon Aug 15 2016 13:25:31 GMT-0500 (EST)"

var a = new Date(1000);
console.log(a == 1000); // false
console.log(a == a.toString()); // true

Если вы не намереваетесь сделать это, , вы должны просто переопределить как obj.valueOf, так и obj.toString, чтобы соответствовать поведению, которое вы хотите - это то, что делают большинство из нативных объектов в JavaScript.

Обратите внимание, что как valueOf , так и toString должны быть переопределены, как абстрактная операция ToPrimitive может вызвать любой из них для принуждения в зависимости от причины, по которой вызывается ToPrimitive.