// ES6 19.4.3.4 Symbol.prototype[@@toPrimitive](hint) // This method gets the primitive symbol from a Symbol wrapper object. var sym = Symbol.for("truth") var obj = Object(sym); assertEq(obj[Symbol.toPrimitive]("default"), sym); // The hint argument is ignored. assertEq(obj[Symbol.toPrimitive]("number"), sym); assertEq(obj[Symbol.toPrimitive]("string"), sym); assertEq(obj[Symbol.toPrimitive](), sym); assertEq(obj[Symbol.toPrimitive](Math.atan2), sym); // The this value can also be a primitive symbol. assertEq(sym[Symbol.toPrimitive](), sym); // Or a wrapper to a Symbol object in another compartment. var obj2 = newGlobal().Object(sym); assertEq(obj2[Symbol.toPrimitive]("default"), sym); // Otherwise a TypeError is thrown. var symbolToPrimitive = Symbol.prototype[Symbol.toPrimitive]; var nonSymbols = [ undefined, null, true, 13, NaN, "justice", {}, [sym], symbolToPrimitive, new Proxy(obj, {}) ]; for (var value of nonSymbols) { assertThrowsInstanceOf(() => symbolToPrimitive.call(value, "string"), TypeError); } // Surface features: assertEq(symbolToPrimitive.name, "[Symbol.toPrimitive]"); var desc = Object.getOwnPropertyDescriptor(Symbol.prototype, Symbol.toPrimitive); assertEq(desc.configurable, true); assertEq(desc.enumerable, false); assertEq(desc.writable, false); reportCompare(0, 0);