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

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 native 对象,默认情况下它将把值转换为字符串而不是数字:

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 以匹配您想要的行为-这是大多数 native 对象在JavaScript中所做的。

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

关于javascript - Symbol.toPrimitive与Object.prototype.valueOf,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27730211/

10-10 19:00