Source code

Revision control

Copy as Markdown

Other Tools

// 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);