2017-06-11 2 views
1

J'ai remarqué une décision de transpiration quelque peu étrange de la part de babel, en ce qui concerne les paramètres optionnels. Le code ES6 suivant:Pourquoi Babel utilise l'objet `arguments` pour les paramètres optionnels?

function myFunction(x = 2, y = 3) {} 

se transpiled à

function myFunction() { 
    var x = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 2; 
    var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3; 
} 

J'ai bientôt une présentation sur la façon dont la syntaxe ES6 beaucoup plus courte et plus concise et comment il regarderais dans ES5 (via Babel d'habitude). Mais pour moi, cela semble un peu forcé et aussi beaucoup moins performant. Y at-il des raisons de ne pas faire cela ?:

function myFunction(x, y) { 
    x = x === undefined ? 2 : x; 
    y = y === undefined ? 3 : y; 
} 
+0

Oui. Imaginez une fonction dans laquelle vous passeriez undefined comme argument. C'est pourquoi le contrôle de longueur est nécessaire. –

+1

@JaredSmith: Si vous passez 'undefined' comme valeur pour un paramètre par défaut, la valeur par défaut est utilisée, pas' undefined'. –

+1

Pour votre présentation, je ne comparerais pas la syntaxe ES2015 à l'apparence de l'équivalent ES5 lors de la transmission. Au lieu de cela, je voudrais comparer la syntaxe ES2015 avec ce que vous écririez réellement dans ES5, qui est peu susceptible de ressembler beaucoup à ce que Babel fait dans de nombreux cas (regardez en particulier ce qu'il fait avec 'class'). C'est plus informatif en termes de réels avantages de la nouvelle syntaxe. Je pense que nous pouvons tous être d'accord que votre premier bloc de code ci-dessus est plus concis que votre dernier (et beaucoup diraient plus clair aussi, mais c'est plus subjectif). –

Répondre

4

Y at-il des raisons de ne pas le faire?

Il serait en contradiction avec la description, qui dit que le arité (.length) de la fonction est le nombre de paramètres déclarés avant le premier paramètre à une valeur par défaut ou le paramètre de repos. (Cette définition starts here, suivant ce passage est ... amusant, mais c'est ce qu'il se résume à..)

Votre myFunction n'a pas de paramètres déclarés avant la première avec une valeur par défaut, et a donc length == 0. S'il a été transpilé comme vous le suggérez, il aurait plutôt length == 2, ce qui serait une violation de la spécification.