Assegnazione di ristrutturazione in JavaScript
-
03-07-2019 - |
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?
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/ )