function shouldBe(actual, expected) { if (actual !== expected) throw new Error('bad value: ' + actual); } { let source = { get x() { delete this.y; return 42; }, y: 42 }; let result = Object.values(source); shouldBe(result.length, 1); shouldBe(result[0], 42); } { let source = Object.defineProperties({}, { nonEnumerable: { enumerable: false, value: 42 } }); let result = Object.values(source); shouldBe(result.length, 0); } { let order = []; let target = {x: 20, y:42}; let handler = { getOwnPropertyDescriptor(theTarget, propName) { order.push(`getOwnPropertyDescriptor ${propName}`); return { enumerable: true, configurable: true, value: 42 }; }, get(theTarget, propName, receiver) { order.push(`get ${propName}`); return 20; } }; let proxy = new Proxy(target, handler); let result = Object.values(proxy); shouldBe(result.length, 2); shouldBe(result[0], 20); shouldBe(result[1], 20); shouldBe(order.join(','), `getOwnPropertyDescriptor x,get x,getOwnPropertyDescriptor y,get y`); } { let order = []; let target = Object.defineProperties({}, { x: { enumerable: false, configurable: true, value: 20 }, y: { enumerable: false, configurable: true, value: 42 } }); let handler = { getOwnPropertyDescriptor(theTarget, propName) { order.push(`getOwnPropertyDescriptor ${propName}`); return { enumerable: false, configurable: true, value: 42 }; }, get(theTarget, propName, receiver) { order.push(`get ${propName}`); return 42; } }; let proxy = new Proxy(target, handler); let result = Object.values(proxy); shouldBe(result.length, 0); shouldBe(order.join(','), `getOwnPropertyDescriptor x,getOwnPropertyDescriptor y`); }