function shouldBe(actual, expected) { if (actual !== expected) throw new Error(`bad value: ${String(actual)}`); } function shouldThrow(func, errorMessage) { var errorThrown = false; var error = null; try { func(); } catch (e) { errorThrown = true; error = e; } if (!errorThrown) throw new Error('not thrown'); if (String(error) !== errorMessage) throw new Error(`bad error: ${String(error)}`); } shouldBe(JSON.stringify(new Proxy([undefined], {})), `[null]`); shouldBe(JSON.stringify(new Proxy([function() { }], {})), `[null]`); shouldBe(JSON.stringify(new Proxy({ value: undefined }, {})), `{}`); shouldThrow(function () { let proxy = new Proxy([], { get(theTarget, propName) { if (propName === 'length') throw new Error('ok'); return 42; } }); JSON.stringify(proxy); }, `Error: ok`);