Der ECMAScript 6-Standard fügte der JavaScript-Sprache viele neue Funktionen hinzu, einschließlich einer neuen Pfeilfunktionsnotation .
Ihre Aufgabe ist es, einen grundlegenden ES6-zu-ES5-Transpiler zu schreiben. Wenn nur ein ES6-Pfeil als Eingabe fungiert, geben Sie das ES5-kompatible Gegenstück aus.
Es ist Code-Golf ! Möge das kürzeste Programm in Bytes gewinnen!
Die Grundlagen
Eine Pfeilfunktion sieht folgendermaßen aus:
(a, b, c) => { return a + b - c }
Und sein äquivalenter ES5-Funktionsausdruck sieht folgendermaßen aus:
function(a, b, c) { return a + b - c }
Im Allgemeinen können Sie den Hauptteil der Funktion (alles zwischen den geschweiften Klammern) wörtlich kopieren.
Implizite Rückgabeerklärung
Anstelle eines Körpers mit geschweiften Klammern kann ein einzelner Ausdruck verwendet werden. Das Ergebnis dieses Ausdrucks wird dann zurückgegeben.
(a, b, c) => a + b - c
function(a, b, c) { return a + b - c }
Ein anderes Beispiel:
(a, b, c) => (a + 1, b - 2 * c / 3)
function(a, b, c) { return (a + 1, b - 2 * c / 3) }
Auch hier können Sie den Ausdruck einfach wörtlich kopieren - ABER achten Sie darauf, dass Sie keinen Zeilenumbruch zwischen ihm und dem returnSchlüsselwort ausgeben , um ein automatisches Einfügen von Semikolons zu vermeiden!
Ein Argument
Klammern sind optional, wenn ein Argument angegeben wird.
foo => { return foo + 'bar' }
function(foo) { return foo + 'bar' }
Leerzeichen
Schließlich müssen Sie in der Lage sein, eine beliebige Anzahl von Leerzeichen (Leerzeichen, Tabulatoren, Zeilenumbrüche) vor oder nach Klammern, Variablen, Kommas, geschweiften Klammern und dem Pfeil * zu berücksichtigen.
( o , O
, _ )=>{
return "Please don't write code like this."
}
Es liegt an Ihnen, ob Sie Leerzeichen in der Ausgabe beibehalten oder nicht. Behalten Sie sie, entfernen Sie sie oder fügen Sie Ihre eigenen hinzu - stellen Sie einfach sicher, dass es sich um einen gültigen Code handelt!
* Es ist technisch illegal, dass ein Pfeil unmittelbar nach einem Zeilenumbruch kommt, aber ich bezweifle, dass diese Tatsache Ihnen helfen würde. :) :)
Ein schneller Weg, um Ihre Ausgabe zu validieren:
Geben Sie var foo = <your output>; foo()in Ihre Browserkonsole ein. Wenn es sich nicht beschwert, sind Sie wahrscheinlich auf dem richtigen Weg.
Weitere Regeln für die Assistenten:
- Die Eingabe ist eine syntaktisch gültige ES6-Pfeilfunktion.
- Es sei angenommen , um den Körper der Funktion ist ES5-kompatibel (und nicht Referenz
this,super,argumentsusw.). Dies bedeutet auch, dass die Funktion niemals eine andere Pfeilfunktion enthält (Sie können jedoch nicht davon ausgehen, dass "=>" niemals im Körper auftreten wird). - Variablennamen bestehen nur aus lateinischen Grundbuchstaben
$und_. - Sie müssen keine ES6-Funktionen transpilieren, die oben nicht aufgeführt sind (Standardparameter, Ruheoperator, Destrukturierung usw.).
- Der Raum nach einer
returnAnweisung ist optional , wenn gefolgt von(,[oder{. - Es ist nicht unbedingt erforderlich, meine Testfälle genau abzugleichen. Sie können den Code beliebig ändern, um die Anzahl der Bytes zu senken. Wirklich, solange Sie einen syntaktisch gültigen, funktional äquivalenten ES5-Funktionsausdruck erzeugen, sind Sie golden!
a =>\na, wo function(a){ return\na }tatsächlich zurückgegeben würde , undefinedegal was der Wert von aist. Müssen wir damit umgehen?
=>?