Frage

Wie in der Mozilla changlog für JavaScript 1.7 sie hinzugefügt haben Destrukturierung Zuordnung zu sehen. Leider bin ich nicht sehr gern die Syntax (warum schreiben und b zweimal?):

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

So etwas wäre viel besser gewesen:

var [a, b] = f();

Das wäre immer noch rückwärts kompatibel sein. Python-like Destrukturierung nicht rückwärtskompatibel sein.

Wie auch immer die beste Lösung für JavaScript 1.5, die ich in der Lage gewesen, mit zu kommen ist:

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

Welche funktioniert wie:

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

Aber das saugt wirklich, weil _ keine Bedeutung hat. Es ist nur eine leere Hülle, die Namen zu speichern. Aber leider ist es erforderlich, da kein JavaScript Zeiger haben. Auf der positiven Seite können Sie die Standardwerte in dem Fall, dass die Werte nicht übereinstimmen zuweisen. Beachten Sie auch, dass diese Lösung nicht funktioniert versuchen, das Array zu schneiden. So kann man nicht so etwas wie {first: 0, rest: 0} tun. Aber das leicht getan werden könnte, wenn man das Verhalten will.

Was ist eine bessere Lösung?

War es hilfreich?

Lösung

Zunächst einmal, var [a, b] = f() funktioniert gut in JavaScript 1.7 - versuchen Sie es

!

Zweitens können Sie die Verwendung Syntax glätten leicht mit with():

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

Natürlich wird dies nicht zulassen, dass Sie die Werte von vorhandenen Variablen ändern, so IMHO ist es eine ganze Menge weniger nützlich als die JavaScript 1.7-Funktion. In Code Ich schreibe jetzt , ich habe gerade Objekte zurückgeben direkt und ihre Mitglieder verweisen -. Ich werde warten, bis die 1.7-Features weiter verbreitet werden

Andere Tipps

Sie brauchen nicht die Dummy "_" Variable. Sie können „globale“ Variablen unter Verwendung des Fensterobjekt Umfang direkt erstellen:

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

Hier sind einige weitere Punkte:

  • Ich würde diese Funktion nicht nennen „Zuweisen“, denn das zu allgemein ist ein Begriff.
  • Um stärker ähneln JS 1.7 Syntax, würde ich die Funktion übernehmen Sie das Ziel als erstes machen Argument und die Quelle als die zweites Argument.
  • ein Objekt mit wörtlichen die Zielvariablen passieren cool, aber kann mit JS 1.7 Destrukturierung verwirrt sein, wenn das Ziel tatsächlich ein Objekt ist und kein Array. Ich ziehe es nur eine kommagetrennte Liste von Variablennamen als String verwendet wird.

Hier ist, was ich kam mit:

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

Hier ist, was ich in PhpStorm hat 10:

Datei -> Einstellungen -> Sprachen & Frameworks -> ...

... gesetzt JavaScript Sprachversion z.B. JavaScript 1.8.5 ...

. -> klicken Sie auf Anwenden

In dem Standard JavaScript wir auf alle Arten von Hässlichkeit gewöhnen, und Destrukturierung Zuordnung emuliert eine Zwischenvariable ist nicht so schlecht:

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

Aber ich denke, das folgende Muster ist idomatic:

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

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

Beachten Sie, dass stattdessen die beiden Ergebnisse als Array zurückzugeben, können wir sie als Argument an eine Callback-Funktion übergeben.

(Siehe Code läuft unter http://jsfiddle.net/vVQE3/ )

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top