AMcoder - javascript, python, java, html, php, sql

Անսպասելի ապակառուցողական վարքագիծ, որը պետք է երկու անգամ հայտարարի բանալին ավելի խորը քանդելիս [կրկնօրինակ]

Ես ES6-ում որոշ քանդում էի և բախվեցի անսպասելի իրավիճակի: Ահա տեղի ունեցածի մանրացված վարկածը:

let obj = {x: {y: 5}};
let {x: {y}} = obj;

console.log(x); // x is not defined
console.log(y); // 5

Իմ օգտագործման դեպքում ինձ անհրաժեշտ էր մուտք գործել և՛ x, և՛ y: Ես կսպասեի, որ x-ը նույնպես քանդված կլիներ: Փոխարենը, ցանկալի էֆեկտ ստանալու համար ես ստիպված էի անել հետևյալը.

let obj = {x: {y: 5}};
let {x, x: {y}} = obj;

console.log(x); // {"y":5}
console.log(y); // 5

Այնուամենայնիվ, կարծում եմ, {x, x: {y}}-ը տարօրինակ և ոչ ինտուիտիվ տեսք ունի: Կա՞ ինչ-որ ապակառուցողական գաղտնիք, որի մասին ես տեղյակ չեմ, թե՞ սա պարզապես քանդող փոքր որոգայթ է:

29.07.2016

  • Ինչ վերաբերում է ձեր ակնկալիքների ինտուիտիվությանը, ինչպե՞ս եք ակնկալում, որ const {x: {x}} = {x: {x: 5}}-ն իրեն պահի: Արդյո՞ք այն պետք է քանդի առաջին x-ը և այնուհետև վերանշանակի x-ը երկրորդ xին: Բայց x-ը հաստատուն է և չի կարող վերանշանակվել: Արդյո՞ք այն պետք է նետի x has already been declared ապա: 30.07.2016

Պատասխանները:


1

Դա որոգայթ չէ, այլ ակնկալվող վարքագիծ, մի բան, որը սահմանվում է շարահյուսության ապակառուցում:

Կարող է լինել AssignmentPropertyListObjectAssignmentPattern-ում և բնադրված AssignmentPropertyListAssignmentPropertyList_ում: Յուրաքանչյուր AssignmentPropertyList կարող է լինել կամ AssignmentProperty կամ PropertyName : AssignmentElement:

Այս դեպքում

let {x, x: {y}} = obj;

առաջին xAssignmentProperty է, երկրորդը՝ x___________ է:

Nested destructuring-ի գաղափարը կայանում է նրանում, որ ուղի տրամադրվի ներկառուցված գույքի համար, որը կկործանվի: Ակնկալվող վարքագիծն այն է, որ չ ստանան անցանկալի փոփոխականներ ներկառուցված ապակառուցման յուրաքանչյուր մակարդակի համար, անհրաժեշտության դեպքում միջանկյալ xը պետք է հստակորեն ապակառուցվի:

Այս շարահյուսության մեջ ոչ մի տարօրինակ կամ ոչ ինտուիտիվ բան չպետք է լինի այն մշակողի համար, ով ծանոթ է դրան: Այն փոփոխությունը, որն ավելի մոտ է այն ամենին, ինչ անում է կոդը (և, հնարավոր է, ավելի ընթեռնելի):

let {x} = obj;
let {y} = x;
29.07.2016
  • Շնորհակալ եմ ճանապարհին ինձ վիրավորելու համար: ???? 30.07.2016
  • @BlueJ774 Ես վիրավորանք չեմ ունեցել մտքումս. Բայց ուրախ եմ, որ կարողացա ամեն կերպ օգնել: 30.07.2016
  • Այս շարահյուսության մեջ ոչ մի տարօրինակ կամ ոչ ինտուիտիվ բան չպետք է լինի այն մշակողի համար, ով ծանոթ է դրան: Ես պարզապես ասում եմ, որ սա զարմացրեց ինձ և երկրորդ մշակողին: Մենք երկուսս էլ գրում ենք ձեռնարկության ES6 կոդը երկու տարի: 30.07.2016
  • @BlueJ774 Ավելի լավ է մտածել ապակառուցման մասին, ինչպես օբյեկտ ստեղծելու հակառակը, որտեղ let y = 5; let obj = {x: {y}};-ը չի փորձում կարդալ x՝ բանալին ստանալու համար, ապակառուցվածքը չի փորձում գրել x փոփոխականի վրա: 30.07.2016
  • Այս նախադասության մեջ նվաստացում չկա, խոսքը ծանոթության աստիճանի մասին է: Ինձ այնքան էլ դուր չէր գալիս, թե որքան անընթեռնելի է դառնում կոդը ES6+-ի որոշ առանձնահատկություններով մեկ տարի առաջ, հիմա ես լիովին լավ եմ, թե ինչպես են նրանք այնտեղ տեսք ունենում: Ինչ վերաբերում է ապակառուցմանը, ես չեմ շփոթում let {x, x: {y}}-ի հետ, բայց դեռ նախընտրում եմ let {x} = obj; let {y} = x-ը, պարզապես այն ճիշտ է թվում: 30.07.2016
  • Կներես. Ես սխալ եմ հասկացել քո մտադրությունը նախադասության հետ կապված. 30.07.2016
  • @BlueJ774 Խնդիր չկա: 30.07.2016

  • 2

    Սա.

    let {x: {y}} = obj;
    

    հապավում է.

    let {x: {y: y}} = obj;
    

    Ապակառուցումը համընկնում է երկու կետի ձախ կողմերը (ստեղները) տվյալների հետ և արդյունքները դնում է աջ կողմերում (հանձնարարական թիրախներ, սովորաբար փոփոխականներ): Հետևաբար, x-ն այստեղ պարզապես բանալի է, մինչդեռ y-ը և՛ բանալի է, և՛ նոր հայտարարագրված փոփոխական:

    29.07.2016
  • Շնորհակալություն, @AxelRauschmayer, հաճելի է ձեզնից պատասխան ստանալ այստեղ: Ինձ համար պարզ, բայց հասկանալի բացատրություն է թվում: 30.07.2016
  • Նոր նյութեր

    Օգտագործելով Fetch Vs Axios.Js-ը՝ HTTP հարցումներ կատարելու համար
    JavaScript-ը կարող է ցանցային հարցումներ ուղարկել սերվեր և բեռնել նոր տեղեկատվություն, երբ դա անհրաժեշտ լինի: Օրինակ, մենք կարող ենք օգտագործել ցանցային հարցումը պատվեր ներկայացնելու,..

    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար
    Տիրապետել հանգստության արվեստին. մշակողի ուղեցույց՝ ճնշման տակ ծաղկելու համար Ինչպե՞ս հանգստացնել ձեր միտքը և աշխատեցնել ձեր պրոցեսորը: Ինչպես մնալ հանգիստ և զարգանալ ճնշման տակ...

    Մեքենայի ուսուցում բանկային և ֆինանսների ոլորտում
    Բարդ, խելացի անվտանգության համակարգերը և հաճախորդների սպասարկման պարզեցված ծառայությունները բիզնեսի հաջողության բանալին են: Ֆինանսական հաստատությունները, մասնավորապես, պետք է առաջ մնան կորի..

    Ես AI-ին հարցրի կյանքի իմաստը, այն ինչ ասում էր, ցնցող էր:
    Այն պահից ի վեր, երբ ես իմացա Արհեստական ​​ինտելեկտի մասին, ես հիացած էի այն բանով, թե ինչպես է այն կարողանում հասկանալ մարդկային նորմալ տեքստը, և այն կարող է առաջացնել իր սեփական արձագանքը դրա..

    Ինչպես սովորել կոդավորումը Python-ում վագրի պես:
    Սովորելու համար ծրագրավորման նոր լեզու ընտրելը բարդ է: Անկախ նրանից, թե դուք սկսնակ եք, թե առաջադեմ, դա օգնում է իմանալ, թե ինչ թեմաներ պետք է սովորել: Ծրագրավորման լեզվի հիմունքները, դրա..

    C++-ի օրական բիթ(ե) | Ամենաերկար պալինդրոմային ենթաշարը
    C++ #198-ի ամենօրյա բիթ(ե), Ընդհանուր հարցազրույցի խնդիր. Ամենաերկար պալինդրոմային ենթատող: Այսօր մենք կանդրադառնանք հարցազրույցի ընդհանուր խնդրին. Ամենաերկար palindromic substring...

    Kydavra ICAReducer՝ ձեր տվյալների ծավալայինությունը նվազեցնելու համար
    Ի՞նչ է ICAReducer-ը: ICAReducer-ն աշխատում է հետևյալ կերպ. այն նվազեցնում է նրանց միջև բարձր փոխկապակցված հատկանիշները մինչև մեկ սյունակ: Բավականին նման է PCAreducer-ին, չնայած այն..