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
的主要目的是改变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 的原因。
在 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
的主要目的是改变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 的原因。