Javascript Symbol.toPrimitive vs Object.prototype.valueOf
在ECMAScript 6中,引入了一个新的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函数,可以重新定
符号.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
是通过一个参数调用的,该参数指示它应该转换为哪种类型(“默认值”)。“数字”或“字符串”)