function assert(a) { if (!a) throw new Error('Bad assertion'); } // Check rest ordering without Proxy (function () { var calls = []; var o = { get z() { calls.push('z') }, get a() { calls.push('a') } }; Object.defineProperty(o, 1, { get: () => { calls.push(1) }, enumerable: true }); Object.defineProperty(o, Symbol('foo'), { get: () => { calls.push('Symbol(foo)') }, enumerable: true }); var {...r} = o; assert(calls[0] === 1); assert(calls[1] === 'z'); assert(calls[2] === 'a'); assert(calls[3] === 'Symbol(foo)'); assert(Object.keys(r).length === 3); })(); // Check spread ordering with Proxy (function () { var calls = []; var o = { z: 2, a: 3 }; var fooSymbol = Symbol('foo'); Object.defineProperty(o, 1, { value: 4, enumerable: true }); Object.defineProperty(o, fooSymbol, { value: 5, enumerable: true }); var p = new Proxy(o, { get: function(target, property, receiver) { calls.push(property); return target[property]; } }); var {...r} = p; assert(calls[0] == 1); assert(calls[1] == 'z'); assert(calls[2] == 'a'); assert(calls[3] === fooSymbol); assert(Object.keys(r).length === 3); })();