function test() { var symbol = Symbol("test"); var proxy = new Proxy({}, { getOwnPropertyDescriptor(t, n) { // Required to prevent Object.keys() from discarding results return { enumerable: true, configurable: true }; }, ownKeys: function (t) { return ["A", "A", "0", "0", symbol, symbol]; } }); var keys = Object.keys(proxy); var names = Object.getOwnPropertyNames(proxy); var symbols = Object.getOwnPropertySymbols(proxy); if (keys.length === 4 && keys[0] === keys[1] && keys[2] === keys[3] && keys[0] === "A" && keys[2] === "0" && names.length === 4 && names[0] === names[1] && names[2] === names[3] && names[0] === "A" && names[2] === "0" && symbols.length === 2 && symbols[0] === symbols[1] && symbols[0] === symbol) return true; return false; } if (!test()) throw new Error("Test failed");