Javascript Symbol.toPrimitive vs Object.prototype.valueOf

Javascript Symbol.toPrimitive vs Object.prototype.valueOf,javascript,ecmascript-6,Javascript,Ecmascript 6,在ECMAScript 6中,引入了一个新的符号.toPrimitive符号,当用作对象键时,它是一个返回对象的基本值的函数: let object = { aNumber: 0, [Symbol.toPrimitive]() { return this.aNumber; } }; object.aNumber = 5; console.log(object + 2) // 7 但是,还有Object.prototype.valueOf函数,可以重新定

在ECMAScript 6中,引入了一个新的
符号.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中定义新对象时,应该使用以下哪种方法将对象转换为其原始值?

符号的主要目的是改变在不同强制场景中调用
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
,因为抽象操作可能会根据调用ToPrimitive的原因调用其中一个进行强制。

->抽象操作ToPrimitive接受一个输入参数和一个可选参数PreferredType。抽象操作ToPrimitive将其输入参数转换为非对象类型。如果一个对象能够转换为多个基元类型,它可以使用可选的提示PreferredType来支持该类型。-如果没有自定义的
.toPrimitive()
则生成
.valueOf()
的结果returned@Andreas链接到的段落与
Symbol
规范无关,而是与将任何非基本值转换为基本值有关。“Symbol.toPrimitive”的相应规范是
Symbol
,现在在所有现代浏览器(无IE11)中都受支持,
Symbol.toPrimitive
是。@rvighne感谢您的提醒,我已经更新了答案。另外,
Symbol.toPrimitive
是通过一个参数调用的,该参数指示它应该转换为哪种类型(“默认值”)。“数字”或“字符串”)