Symbol.toPrimitive 对比 Object.prototype.valueOf

Symbol.toPrimitive vs Object.prototype.valueOf

在 ECMAScript 6 中,引入了一个新的 Symbol.toPrimitive 符号,当用作对象键时,should define 一个函数 return 原始值 个对象:

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

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

但是,还有 Object.prototype.valueOf 函数,according to the documentation 可以重新定义以将对象转换为原始值:

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

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

那么,在定义新对象时,在 ES6 中应该使用哪些将对象转换为其原始值的方法?

Symbol.toPrimitive的主要目的是改变toStringvalueOf在不同强制场景下的调用顺序。

一个例子是 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.valueOfobj.toString 以匹配您想要的行为 - 这是 JavaScript.

中大多数本机对象所做的

请注意,valueOf toString 都应被覆盖,因为 ToPrimitive 抽象操作可能会调用它们中的任何一个进行强制转换,具体取决于关于调用 ToPrimitive 的原因。