/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/licenses/publicdomain/ */ // for-in loops skip properties with symbol keys, even enumerable properties. var obj = {}; obj[Symbol.for("moon")] = "sun"; obj[Symbol("asleep")] = "awake"; obj[Symbol.iterator] = "List"; for (var x in obj) throw "FAIL: " + String(x); // This includes inherited properties. var obj2 = Object.create(obj); for (var x in obj2) throw "FAIL: " + String(x); // The same goes for proxies. var p = new Proxy(obj, {}); for (var x in p) throw "FAIL: " + String(x); var p2 = new Proxy(obj2, {}); for (var x in p2) throw "FAIL: " + String(x); // Object.keys() and .getOwnPropertyNames() also skip symbols. assertEq(Object.keys(obj).length, 0); assertEq(Object.keys(p).length, 0); assertEq(Object.keys(obj2).length, 0); assertEq(Object.keys(p2).length, 0); assertEq(Object.getOwnPropertyNames(obj).length, 0); assertEq(Object.getOwnPropertyNames(p).length, 0); assertEq(Object.getOwnPropertyNames(obj2).length, 0); assertEq(Object.getOwnPropertyNames(p2).length, 0); // Test interaction of Object.keys(), proxies, and symbol property keys. var log = []; var h = { ownKeys: (t) => { log.push("ownKeys"); return ["a", "0", Symbol.for("moon"), Symbol("asleep"), Symbol.iterator]; }, getOwnPropertyDescriptor: (t, key) => { log.push("gopd", key); return {configurable: true, enumerable: true, value: 0, writable: true}; } }; p = new Proxy({}, h); assertDeepEq(Object.keys(p), ["a", "0"]); assertDeepEq(log, ["ownKeys", "gopd", "a", "gopd", "0"]); if (typeof reportCompare === "function") reportCompare(0, 0);