pattern multiple es6 ecmascript desestructuración assignment javascript variable-assignment destructuring

javascript - multiple - object es6



Asignación de desestructuración en JavaScript (4)

No necesita la variable ficticia "_". Puede crear directamente variables "globales" utilizando el alcance del objeto de ventana:

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

Aquí hay algunos puntos más:

  • No nombraría a esta función "asignar" porque ese es un término demasiado genérico.
  • Para parecerse más a la sintaxis de JS 1.7, haría que la función tomara el destino como primer argumento y la fuente como segundo argumento.
  • Usar un objeto literal para pasar las variables de destino es genial, pero se puede confundir con la desestructuración de JS 1.7, donde el destino es realmente un objeto y no una matriz. Prefiero simplemente usar una lista delimitada por comas de nombres de variables como una cadena.

Esto es lo que se me ocurrió:

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

Como se puede ver en el changlog de Mozilla para JavaScript 1.7, han agregado una asignación de desestructuración. Lamentablemente, no me gusta mucho la sintaxis (¿por qué escribir a y b dos veces?):

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

Algo como esto hubiera sido mucho mejor:

var [a, b] = f();

Eso todavía sería compatible con versiones anteriores. La desestructuración similar a Python no sería retrocompatible.

De todos modos, la mejor solución para JavaScript 1.5 que he podido encontrar es:

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

Que funciona como:

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

Pero esto realmente apesta porque _ no tiene ningún significado. Es solo un caparazón vacío para almacenar los nombres. Pero lamentablemente es necesario porque JavaScript no tiene punteros. En el lado positivo, puede asignar valores predeterminados en caso de que los valores no coincidan. También tenga en cuenta que esta solución no intenta cortar el conjunto. Entonces no puedes hacer algo como {first: 0, rest: 0} . Pero eso podría hacerse fácilmente, si uno quisiera ese comportamiento.

¿Cuál es una mejor solución?


En primer lugar, var [a, b] = f() funciona perfectamente en JavaScript 1.7. ¡Pruébalo!

En segundo lugar, puede suavizar ligeramente la sintaxis de uso with() :

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

Por supuesto, esto no le permitirá modificar los valores de las variables existentes, por lo que en mi humilde opinión es mucho menos útil que la función de JavaScript 1.7. En el código que estoy escribiendo ahora , solo devuelvo los objetos directamente y hago referencia a sus miembros. Esperaré a que las características 1.7 estén más ampliamente disponibles.


En JavaScript estándar nos acostumbramos a todo tipo de fealdad, y emular la asignación de desestructuración utilizando una variable intermedia no es tan malo:

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 );

Sin embargo, creo que el siguiente patrón es más idóneo:

function divMod2(a, b, callback) { callback(Math.floor(a / b), a % b); } divMod2(11, 3, function(div, mod) { alert("(2) div=" + div + ", mod=" + mod ); });

Tenga en cuenta que, en lugar de devolver los dos resultados como una matriz, los pasamos como argumentos a una función de devolución de llamada.

(Ver el código que se ejecuta en http://jsfiddle.net/vVQE3/ )


Esto es lo que hice en PHPstorm 10:

Archivo -> Configuración -> Idiomas y marcos -> ...

... establecer la versión del lenguaje JavaScript para, por ejemplo, JavaScript 1.8.5 ...

-> haga clic en Aplicar.