On Nov 5, 2011, at 9:44 AM, Brendan Eich wrote: > On Nov 5, 2011, at 9:28 AM, Allen Wirfs-Brock wrote: > >> In the following declaration, what should be the value of z? >> >> let [z,y,z] = {0:0, 1:1, length: 2, 2:2}; >> >> should it be be 2 or undefined >> >> undefined might be reasonable because it is an array pattern, and the source >> object is only has two "array-like" elements >> 2 might be reasonable because the source object actually has a property >> named "2" >> >> Which alternative will be least surprising to JS programmers? > > What I implemented long ago in SpiderMonkey based on the ES4 proposal gives > z=2. I still think that's the best answer. > > Destructuring is "irrefutable" in that it desugars to assignments from > properties of the RHS. It is not typed; it is not refutable (no one mention > Erlang -- oops, Dmitry did; ok, refutable match is a separate beast, proposed > but deferred: wiki.ecmascript.org/doku.php?id=strawman:pattern_matching). It > should not impose any particular constraints on the RHS object based on the > LHS pattern. > > In this case, the RHS object is not consistent with Array invariants anyway. > That means as much, if not more, than the array pattern. Someone may have set > it up that way for a reason. It could have come from a JSON deserialization. > The array pattern should not check for 'length' and enforce Array invariants > that do not apply inherently on the RHS.
But all other array operators and functions use "length" to limit their bounds when dealing with array-like objects. Also, via inheritance a real array can acquire an integer keyed property that is beyond its length bound: let [z,y,z] = {2:2} <| [0,1]; Allen _______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss