2012-09-23 5 views
10

Ich habe einige Beispiele gesehen, die zeigen, dass Firefox eine Art JavaScript-Syntax im Sinne von *something* if *expression*; unterstützt.* etwas * if * Ausdruck * Syntax in JavaScript (FF)

Als ein Beispiel von dem, was ich rede, siehe this MDN article, die das folgende Beispiel enthält:

var evens = [i for each (i in range(0, 21)) if (i % 2 == 0)]; 

Meine Fragen sind:

Welchen Namen dieser Art gegeben würde beschreiben Syntax? Ich möchte das hauptsächlich wissen, damit ich es googlen und mehr darüber lesen kann. Ich habe versucht, das Beste zu googlen, aber ich war nicht in der Lage, die richtigen Begriffe zusammenzusetzen, um hilfreiche Ergebnisse zu erzielen.

Kann diese Syntax an anderen Stellen außerhalb des Arrayverständnisses existieren? Ich habe das Gefühl, dass ich andere Beispiele gesehen habe, die außerhalb eines Arrays verwendet wurden (wie im obigen Beispiel), aber ich bin mir nicht sicher.

Wo kann ich mehr über diese Syntax lesen?

Unterstützen andere Browser dies neben Firefox?

Ist diese Funktion in ES5 oder für ES-Harmonie geplant?

+0

_ "Wie würde man diese Art von Syntax beschreiben?" _ - Der Artikel, den Sie verlinkt haben, nennt es "Array Comprehensions". – nnnnnn

+0

Ich könnte falsch liegen, aber ich denke, dieser Begriff bezog sich auf die 'für jeden' ​​innerhalb eines Array-Teils. Ich denke, ich habe diese andere 'If'-Syntax außerhalb von Arrays gesehen, aber ich bin mir nicht sicher. ? –

+0

_Nicht nur das Array-Verständnis ist viel kompakter, aber es ist tatsächlich einfacher zu lesen, ** sobald Sie mit dem Konzept vertraut sind ** ._ Ich würde es nur wagen, sobald ich sicher bin, dass jeder die Syntax kennt. Der Betreuer ist ein gewalttätiger Psychopath und alle ... – Laoujin

Antwort

4

Wie andere erwähnt haben, diese „Array Comprehensions“ genannt wird, und es ist einer der vielen, schlug viele Funktionen für ECMAScript Harmony:

http://wiki.ecmascript.org/doku.php?id=harmony:array_comprehensions

Doch wie bei so ziemlich jeder Harmony „Feature“ Ich glaube nicht, dass es eine echte Vorstellung darüber gibt, ob es tatsächlich in der endgültigen Version enthalten sein wird. Sie können es in Firefox als Teil von "JavaScript 1.7" verwenden (eine nebulöse "Standard" Spezifikation, die wirklich gilt nur für Mozilla-basierte Sachen); Es ist jedoch besser, die FF-spezifische Syntax zu vermeiden, insbesondere, wenn dies in anderen Browsern zu Syntaxfehlern führen würde.

Sie können mehr darüber lesen, indem Sie eine Google-Suche nach "Array Comprehensions" durchführen, aber wie bereits erwähnt, ist es aufgrund seiner Mozilla-spezifischen Natur kein sehr nützliches Tool.

Sie können einen ähnlichen Effekt ohne viel Code mit dem reduce() Array-Methode eingeführt in ES5 erreichen:

//JavaScript has no "range" function, so let's make one 
var range = function (begin, length) { 
    var i, ret = []; 
    for (i = begin; i < begin + length; i++) { 
     ret.push(i); 
    } 
    return ret; 
}; 

var evens = range(0, 21).reduce(function (arr, cur) { 
    if (cur % 2 === 0) arr.push(cur); 
    return arr; 
}, []); 

, die wenig sein könnte eine ausführliche im Vergleich zu dem, was Sie gesucht haben (auch wenn man bedenkt, dass wir musste eine range() Funktion erstellen). Aber es ist eine relativ kompakte Lösung, die nicht viel "Setup" erfordert und sich hauptsächlich auf die Lösung des Problems konzentriert: das Filtern von Elementen von einem Array zu einem zweiten Array.

Ich konnte es auf einen Einzeiler reduzieren, aber es wird ein bisschen unweid zu pflegen, also entschied ich mich, stattdessen die zwei Linienversion vorzuschlagen.Wenn Sie sich für das One-Liner interessiert, hier ist es:

//Don't forget to define "range()" 
var evens = range(0, 21).reduce(function (arr, cur) { 
    return (cur % 2 === 0) ? (arr.push(cur) && arr) : arr; 
}, []); 

Auch dies ist ES5-Code. Wenn Sie möchten, dass es in älteren Browsern funktioniert, müssen Sie ein Shim verwenden, um Unterstützung für bereitzustellen. MDN hat man hier:

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/Reduce

UPDATE:

Sieht aus wie ich filter() statt reduce() verwendet haben sollte. Macht den Code viel sauberer. Danke an das OP für den Vorschlag!

var evens = range(0,21).filter(function (cur) { return cur % 2 === 0; }); 

Wieder filter() ist ES5, so dass Sie ein Shim, um es wird richtig auf älteren Browsern funktionieren, um sicherzustellen, benötigen.

+1

+1, aber "JavaScript 1.7" ist keine Art von Standard. JavaScript ist Mozillas proprietäre Implementierung von ECMAScript zur Verwendung in Browsern. Es gibt nicht einmal eine Spezifikation dafür, die einzige Dokumentation, die sich nähert, ist die [Online-Referenz] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference), die als beibehalten wird ein Community-Wiki. – RobG

+0

+1, danke für alle Informationen! Ich würde "Filter" anstelle von "Reduzieren" für die ES5-Variante verwenden. Aber wenn ich an einem Projekt arbeite, bei dem ich nur mit FF arbeiten kann, kann ich auch die JS 1.7-Funktionen verwenden. –

+0

@RobG Danke. Aktualisiert. – Pete

2

Diese Art von Anweisung ist bekannt als list comprehension. Python hat gute Beispiele mit sehr ähnlicher Syntax.

+0

plus 1, danke! –