On the one hand, the is a bug in current spec that allows the ```javascript let {length} = "qwe"; ``` but disallow ```javascript let {text: {length}} = {text: "qwe"}; ```
On the other hand, this restriction can lead to hard-reproducibly errors. When I write a function such as: ```javascript function returnLength( {length} ) { return length; } ``` I can't be sure that foreign user will not use it as: ```javascript var obj = { toString(){ return "test" } }; returnLength( obj + "" ); ``` In this case, I have no other chose, but to rewrite function without destructuring in function parameter: ```javascript function returnLength( text ) { text = new String(text);// do not remove it, without this line following destructuring pattern will throw a error let {length} = text; return length; } ``` Of course, in real app this function would be more complex. On Fri, Apr 11, 2014 at 7:26 PM, Allen Wirfs-Brock <al...@wirfs-brock.com>wrote: > > On Apr 11, 2014, at 5:22 AM, André Bargull wrote: > > > On 4/11/2014 2:02 PM, Егор Николаев wrote: > >> @André Bargull > >> Are there any reasons for these restrictions? It confuses me. If I can > >> for-of over string, so why can't I destructuring it? > > > > I'd say it's mostly a language designer decision and it may still change > before the final specification is published. I'd encourage you to file bug > reports at https://bugs.ecmascript.org/ and/or post to this mailing list > if you find any issues with the current specification draft. That way Allen > (the spec editor, cc-ed) and other TC-39 members are notified and can take > appropriate actions. > > This was discusses fairly extensively in TC39 meetings and on this list. > The final consensus was that non objects should not be destructurable (ie, > ToObject is not applied). One argument against allowing non-objects is > that it might be future-hostile to anticipated future proposal to turn > destructuring into more general pattern patching, > > This is the decision that is reflected in the ES6 draft starting with > rev17. As it stand right now, there is no advocacy within TC39 for > reopening this decision. > > Allen > > > > > > > > > > > > - André > > > > > >> > >> > >> On Fri, Apr 11, 2014 at 3:10 PM, André Bargull <andre.barg...@udo.edu > >> <mailto:andre.barg...@udo.edu>> wrote: > >> > >>> Hi Erop, > >>> > >>> > >>> On Fri, Apr 11, 2014 at 12:35 PM, Егор Николаев <termi1uc1 at > gmail.com <https://mail.mozilla.org/listinfo/es-discuss>> wrote: > >>> > >>> >/ 1. Should the AssignmentExpression of DestructuringAssignment > always to be > >>> / > >>> >/the Object type? />/```javascript />/let {length} = "123"; > >>> />/assert(length, 3); />/``` />/Is this valid? />// Yes. > >> > >> No. > >> > >> 13.2.1.4 Runtime Semantics: Evaluation, > >> LexicalBinding : BindingPattern Initializer, step 4 > >> > >> > https://people.mozilla.org/~jorendorff/es6-draft.html#sec-let-and-const-declarations-runtime-semantics-evaluation > >> > >> > >> > >>> >/ > >>> />/ If it is: > >>> />/ 2. Should the result of Get(obj, name) always be the Object > type if > >>> />/ DestructuringAssignmentTarget is an ObjectLiteral or an > ArrayLiteral? > >>> />/ According the spec 12.14.5.4 step 4.b this expression is > invalid: > >>> />/ ```javascript > >>> />/ let {text: {length}} = {text: "123"}; > >>> />/ assert(length, 3); > >>> />/ ``` > >>> />/ > >>> / > >>> Yes. > >> > >> No. > >> > >> 13.2.3.7 Runtime Semantics: KeyedBindingInitialization > >> BindingElement : BindingPattern Initializer_opt, step 4 > >> > >> > https://people.mozilla.org/~jorendorff/es6-draft.html#sec-runtime-semantics-keyedbindinginitialization > >> > >> > >>> You can test this in the web console in a Nightly or Aurora build of > >>> Firefox. > >> > >> You can test this in traceur or my test implementation > >> [https://github.com/anba/es6draft]. ;-) > >> > >> Maybe the final draft will revert this restriction, it was > >> originally introduced in rev17. It is somewhat annoying, especially > >> for the string type, because the restriction also applies to spread > >> array elements and spread calls. For example `[..."abc"]` must now > >> be written as `[...new String("abc")]` to get the array of code > points. > >> > >> - André > >> > >> > > > >
_______________________________________________ es-discuss mailing list es-discuss@mozilla.org https://mail.mozilla.org/listinfo/es-discuss