Destructuring `undefined` and `null`

# Axel Rauschmayer (10 years ago)

If I understand the spec correctly, destructuring works as follows:

let {} = undefined; // OK???
let {x} = undefined; // TypeError

let [] = undefined; // TypeError
let [y] = undefined; // TypeError

Destructuring undefined (or null) via {} does not throw an exception (as per first rule inside 1). Shouldn’t it throw one?

# Brendan Eich (10 years ago)

Why should it throw if there's no [[Get]]?

Consider let {x} = o as short for let x = o.x (with o evaluated once and first, in the general case, of course). Then the empty object pattern does nothing and should not throw.

This seem best for generated code purposes, it gives a more general basis case.

# Allen Wirfs-Brock (10 years ago)

see ecmascript#3574

already fix in my working draft

# Allen Wirfs-Brock (10 years ago)

On Jan 19, 2015, at 12:06 PM, Brendan Eich wrote:

Why should it throw if there's no [[Get]]?

Consider let {x} = o as short for let x = o.x (with o evaluated once and first, in the general case, of course). Then the empty object pattern does nothing and should not throw.

This seem best for generated code purposes, it gives a more general basis case.

let { } = x;

is probably something that should never be written or generated. But consider:

{x:{ }} = x; asserts: the RHS must be coercible to an object that has an 'x' property that is coercible to an object

compared to:

{x: { }={}} = x; asserts: the RHS must be coercible to an object and if it has an 'x' property its value must be coercible to an object

compared to:

{ } = x asserts RHS must be coercible to an object

compared to:

[ ] = x asserts RHS must be coercible to an Iterable object.

# Brendan Eich (10 years ago)

Allen Wirfs-Brock wrote:

see ecmascript#3574

already fix in my working draft

Ok, so the ToObject always runs first. Sounds better on short reflection