Domanda

Come si può vedere nel changlog di Mozilla per JavaScript 1.7, sono stati aggiunti compiti di destrutturazione. Purtroppo non sono molto affezionato alla sintassi (perché scrivere aeb due volte?):

var a, b;  
[a, b] = f();

Qualcosa del genere sarebbe stato molto meglio:

var [a, b] = f();

Sarebbe comunque compatibile con le versioni precedenti. La destrutturazione simile a Python non sarebbe retrocompatibile.

Comunque la migliore soluzione per JavaScript 1.5 che sono stato in grado di inventare è:

function assign(array, map) {
    var o = Object();
    var i = 0;
    $.each(map, function(e, _) {
        o[e] = array[i++];
    });
    return o;
}

Che funziona come:

var array = [1,2];
var _ = assign[array, { var1: null, var2: null });
_.var1; // prints 1
_.var2; // prints 2

Ma fa davvero schifo perché _ non ha significato. È solo una shell vuota per memorizzare i nomi. Ma purtroppo è necessario perché JavaScript non ha puntatori. Sul lato positivo è possibile assegnare valori predefiniti nel caso in cui i valori non corrispondano. Si noti inoltre che questa soluzione non tenta di suddividere l'array. Quindi non puoi fare qualcosa come {first: 0, rest: 0} . Ma ciò potrebbe facilmente essere fatto, se uno volesse quel comportamento.

Qual è una soluzione migliore?

È stato utile?

Soluzione

Prima di tutto, var [a, b] = f () funziona perfettamente in JavaScript 1.7 - provalo!

In secondo luogo, puoi appianare la sintassi dell'uso leggermente usando con () :

var array = [1,2];
with (assign(array, { var1: null, var2: null }))
{
   var1; // == 1
   var2; // == 2
}

Naturalmente, questo non ti permetterà di modificare i valori delle variabili esistenti, quindi IMHO è molto meno utile della funzione JavaScript 1.7. Nel codice sto scrivendo ora , restituisco direttamente gli oggetti e faccio riferimento ai loro membri - aspetterò che le funzionalità 1.7 diventino più ampiamente disponibili.

Altri suggerimenti

Non hai bisogno del manichino " _ " variabile. Puoi creare direttamente " global " variabili utilizzando l'ambito dell'oggetto finestra:

window["foo"] = "bar";
alert(foo); // Gives "bar"

Ecco alcuni altri punti:

  • Non chiamerei questa funzione & Quot; assegnare " perché è troppo generico un termine.
  • Per assomigliare più da vicino a JS Sintassi 1.7, farei in modo che la funzione prenda la destinazione come prima argomento e la fonte come secondo argomento.
  • L'uso di un oggetto letterale per passare le variabili di destinazione è interessante, ma può essere confuso con JS 1.7 che distrugge dove la destinazione è in realtà un oggetto e non un array. Preferisco semplicemente usare un elenco delimitato da virgole di nomi di variabili come stringa.

Ecco cosa mi è venuto in mente:

function destructure(dest, src) {  
    dest = dest.split(",");  

    for (var i = 0; i < src.length; i++) {  
        window[dest[i]] = src[i];  
    }  
}  

var arr = [42, 66];  

destructure("var1,var2", arr); 

alert(var1); // Gives 42
alert(var2); // Gives 66

Ecco cosa ho fatto in PHPstorm 10:

File - > Impostazioni - > Lingue e amp; Quadri - > ...

... imposta la versione della lingua JavaScript su ad es. JavaScript 1.8.5 ...

- > fai clic su Applica.

In JavaScript standard ci abituiamo a tutti i tipi di bruttezza, ed emulare l'assegnazione destrutturante usando una variabile intermedia non è poi così male:

function divMod1(a, b) {
    return [ Math.floor(a / b), a % b ];
}

var _ = divMod1(11, 3);
var div = _[0];
var mod = _[1];
alert("(1) div=" + div + ", mod=" + mod );

Comunque penso che il seguente modello sia più idomatico:

function divMod2(a, b, callback) {
    callback(Math.floor(a / b), a % b);
}

divMod2(11, 3, function(div, mod) {
    alert("(2) div=" + div + ", mod=" + mod );
});

Si noti che invece di restituire i due risultati come un array, li passiamo come argomenti a una funzione di callback.

(Vedi il codice in esecuzione su http://jsfiddle.net/vVQE3/ )

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top