var symbols = [ Symbol(), Symbol("iterator"), Symbol.for("iterator"), Symbol.iterator ]; for (var sym of symbols) { var key = { toString() { return sym; } }; // Test that ToPropertyKey can return a symbol in each of the following // contexts. // Computed property names. var obj = {[key]: 13}; var found = Reflect.ownKeys(obj); assertEq(found.length, 1); assertEq(found[0], sym); // Computed accessor property names. var obj2 = { get [key]() { return "got"; }, set [key](v) { this.v = v; } }; assertEq(obj2[sym], "got"); obj2[sym] = 33; assertEq(obj2.v, 33); // Getting and setting properties. assertEq(obj[key], 13); obj[key] = 19; assertEq(obj[sym], 19); (function () { "use strict"; obj[key] = 20; })(); assertEq(obj[sym], 20); obj[key]++; assertEq(obj[sym], 21); // Getting properties of primitive values. Number.prototype[sym] = "success"; assertEq(Math.PI[key], "success"); delete Number.prototype[sym]; // Getting a super property. class X { [sym]() { return "X"; } } class Y extends X { [sym]() { return super[key]() + "Y"; } } var y = new Y(); assertEq(y[sym](), "XY"); // Setting a super property. class Z { set [sym](v) { this.self = this; this.value = v; } } class W extends Z { set [sym](v) { this.isW = true; super[key] = v; } } var w = new W(); w[key] = "ok"; assertEq(w.self, w); assertEq(w.value, "ok"); assertEq(w.isW, true); // Deleting properties. obj = {[sym]: 1}; assertEq(delete obj[key], true); assertEq(sym in obj, false); // LHS of `in` expressions. assertEq(key in {iterator: 0}, false); assertEq(key in {[sym]: 0}, true); // Methods of Object and Object.prototype obj = {}; Object.defineProperty(obj, key, {value: "ok", enumerable: true}); assertEq(obj[sym], "ok"); assertEq(obj.hasOwnProperty(key), true); assertEq(obj.propertyIsEnumerable(key), true); var desc = Object.getOwnPropertyDescriptor(obj, key); assertEq(desc.value, "ok"); } reportCompare(0, 0);