2016-01-17 35 views
6

SfondoPosso pre-dichiarare le variabili per l'assegnazione destrutturante di oggetti?

Quando ho provato la destrutturazione incarico con gli array sono stato in grado di controllare la validità di dichiarare le mie variabili:

let a, b, c; 
let arr = [1, 2, 3, 4, 5]; 
[a, b, c] = arr; 

console.log(a) // logs 1 
console.log(b) // logs 2 
console.log(c) // logs 3 

Questo ha attraversato il compilatore Babel bene.

Tuttavia quando ho cercato di fare lo stesso con gli oggetti ho ottenuto un errore

let a, b, c 
let obj = {cat: 'meow', dog: 'woof', mouse: 'squeak'}; 
{cat: a, dog: b, mouse: c} = obj; 

console.log(a) // I want this to log 'meow' 
console.log(b) // I want this to log 'woof' 
console.log(c) // I want this to log 'squeak' 

Domanda

È questa un'ES6 o Babel vezzo/problema? Se è intenzionale per ES6, perché la differenza dal modo in cui vengono trattati gli array?

Nota

ho capito che la sostituzione var con let significa non ho tenuto a pre-dichiarare le mie variabili e che avere la let linea è valida (e, credo, di solito preferivamo). Mi piacerebbe sapere la differenza tra le implementazioni piuttosto che una risposta "non fatelo affatto".

+0

Cosa stai ancora cercando di realizzare con questo: '{ cat: a, cane: b, mouse: c} = obj; '? Hai un oggetto completamente formato in 'obj'. Se vuoi copiarlo su un altro oggetto, usi 'Object.assign()'. – jfriend00

+0

@ jfriend00 Sto imparando come funziona l'assegnazione distruttiva: gli esempi sono puramente a scopo di apprendimento. Ma lo scopo generale sarebbe quello di assegnare valori a 'a',' b', 'c' piuttosto che creare un nuovo oggetto. La distruzione dovrebbe * abbattere * piuttosto che copiare. –

+0

Quindi, puoi semplicemente usare una normale dichiarazione: 'lascia myObj = {cat: a, dog: b, mouse: c};'. Non hai bisogno di destrutturare per quello. Se si desidera assegnare le proprietà nell'oggetto già esistente dai valori di 'a',' b' e 'c', è sufficiente assegnarli manualmente' obj.cat = a; '. – jfriend00

risposta

12

Quando si sta distruggendo un oggetto,

  1. è necessario utilizzare gli stessi nomi delle variabili, come le chiavi nell'oggetto. Solo così otterrai una corrispondenza uno ad uno e i valori verranno destrutturati correttamente.

  2. ed è necessario racchiudere l'intero compito tra parentesi se non si utilizza l'istruzione dichiarazione, altrimenti il ​​letterale dell'oggetto nell'espressione lato sinistro verrà considerato come un blocco e si otterrà SyntaxError.


Così il vostro codice fisso sarebbe stato così

'use strict'; 
let cat, dog, mouse; 
let obj = {cat: 'meow', dog: 'woof', mouse: 'squeak'}; 
({cat, dog, mouse} = obj);  // Note the `()` around 

Si può effettivamente scrivere la stessa

'use strict'; 
let obj = {cat: 'meow', dog: 'woof', mouse: 'squeak'}; 
let {cat, dog, mouse} = obj; 
+1

Ah, grazie! Sono stati gli involucri che non ho capito.Grazie per aver chiarito che altrimenti sarebbe considerato un blocco - ora ha molto più senso :) –

+0

Tranne per "wrapping parens", la risposta è sbagliata :( –

+0

@Refael Puoi spiegare perché la risposta è sbagliata? – thefourtheye