/* Any copyright is dedicated to the Public Domain. * http://creativecommons.org/licenses/publicdomain/ */ // Reflect.deleteProperty deletes properties. var obj = {x: 1, y: 2}; assertEq(Reflect.deleteProperty(obj, "x"), true); assertDeepEq(obj, {y: 2}); var arr = [1, 1, 2, 3, 5]; assertEq(Reflect.deleteProperty(arr, "3"), true); assertDeepEq(arr, [1, 1, 2, , 5]); // === Failure and error cases // Since Reflect.deleteProperty is almost exactly identical to the non-strict // `delete` operator, there is not much to test that would not be redundant. // Returns true if no such property exists. assertEq(Reflect.deleteProperty({}, "q"), true); // Or if it's inherited. var proto = {x: 1}; assertEq(Reflect.deleteProperty(Object.create(proto), "x"), true); assertEq(proto.x, 1); // Return false if asked to delete a non-configurable property. var arr = []; assertEq(Reflect.deleteProperty(arr, "length"), false); assertEq(arr.hasOwnProperty("length"), true); assertEq(Reflect.deleteProperty(this, "undefined"), false); assertEq(this.undefined, void 0); // Return false if a Proxy's deleteProperty handler returns a false-y value. var value; var proxy = new Proxy({}, { deleteProperty(t, k) { return value; } }); for (value of [true, false, 0, "something", {}]) { assertEq(Reflect.deleteProperty(proxy, "q"), !!value); } // If a Proxy's handler method throws, the error is propagated. proxy = new Proxy({}, { deleteProperty(t, k) { throw "vase"; } }); assertThrowsValue(() => Reflect.deleteProperty(proxy, "prop"), "vase"); // Throw a TypeError if a Proxy's handler method returns true in violation of // the object invariants. proxy = new Proxy(Object.freeze({prop: 1}), { deleteProperty(t, k) { return true; } }); assertThrowsInstanceOf(() => Reflect.deleteProperty(proxy, "prop"), TypeError); // === Deleting elements from `arguments` // Non-strict arguments element becomes unmapped function f(x, y, z) { assertEq(Reflect.deleteProperty(arguments, "0"), true); arguments.x = 33; return x; } assertEq(f(17, 19, 23), 17); // Frozen non-strict arguments element function testFrozenArguments() { Object.freeze(arguments); assertEq(Reflect.deleteProperty(arguments, "0"), false); assertEq(arguments[0], "zero"); assertEq(arguments[1], "one"); } testFrozenArguments("zero", "one"); // For more Reflect.deleteProperty tests, see target.js and propertyKeys.js. reportCompare(0, 0);