// Section numbers cite ES6 rev 24 (2014 April 27). var symbols = [ Symbol(), Symbol("one"), Symbol.for("two"), Symbol.iterator ]; function testSymbolConversions(sym) { // 7.1.2 ToBoolean assertEq(Boolean(sym), true); assertEq(!sym, false); assertEq(sym || 13, sym); assertEq(sym && 13, 13); // 7.1.3 ToNumber assertThrowsInstanceOf(() => +sym, TypeError); assertThrowsInstanceOf(() => sym | 0, TypeError); // 7.1.12 ToString assertThrowsInstanceOf(() => "" + sym, TypeError); assertThrowsInstanceOf(() => sym + "", TypeError); assertThrowsInstanceOf(() => "" + [1, 2, sym], TypeError); assertThrowsInstanceOf(() => ["simple", "thimble", sym].join(), TypeError); // 21.1.1.1 String() assertEq(String(sym), sym.toString()); // 21.1.1.2 new String() assertThrowsInstanceOf(() => new String(sym), TypeError); // 7.1.13 ToObject var obj = Object(sym); assertEq(typeof obj, "object"); assertEq(Object.prototype.toString.call(obj), "[object Symbol]"); assertEq(Object.getPrototypeOf(obj), Symbol.prototype); assertEq(Object.getOwnPropertyNames(obj).length, 0); assertEq(Object(sym) === Object(sym), false); // new object each time var f = function () { return this; }; assertEq(f.call(sym) === f.call(sym), false); // new object each time } for (var sym of symbols) { testSymbolConversions(sym); // 7.1.1 ToPrimitive var symobj = Object(sym); assertThrowsInstanceOf(() => Number(symobj), TypeError); assertThrowsInstanceOf(() => String(symobj), TypeError); assertThrowsInstanceOf(() => symobj < 0, TypeError); assertThrowsInstanceOf(() => 0 < symobj, TypeError); assertThrowsInstanceOf(() => symobj + 1, TypeError); assertThrowsInstanceOf(() => "" + symobj, TypeError); assertEq(sym == symobj, true); assertEq(sym === symobj, false); assertEq(symobj == 0, false); assertEq(0 != symobj, true); // 7.1.12 ToString assertThrowsInstanceOf(() => String(Object(sym)), TypeError); } // Deleting Symbol.prototype[@@toPrimitive] does not change the behavior of // conversions from a symbol to other types. delete Symbol.prototype[Symbol.toPrimitive]; assertEq(Symbol.toPrimitive in Symbol.prototype, false); testSymbolConversions(symbols[0]); // It does change the behavior of ToPrimitive on Symbol objects, though. // It causes the default algorithm (OrdinaryToPrimitive) to be used. var VALUEOF_CALLED = 117.25; Symbol.prototype.valueOf = function () { return VALUEOF_CALLED; }; Symbol.prototype.toString = function () { return "toString called"; }; for (var sym of symbols) { var symobj = Object(sym); assertEq(Number(symobj), VALUEOF_CALLED); assertEq(String(symobj), "toString called"); assertEq(symobj < 0, VALUEOF_CALLED < 0); assertEq(0 < symobj, 0 < VALUEOF_CALLED); assertEq(symobj + 1, VALUEOF_CALLED + 1); assertEq("" + symobj, "" + VALUEOF_CALLED); assertEq(symobj == 0, false); assertEq(0 != symobj, true); } if (typeof reportCompare === "function") reportCompare(0, 0);