Почему Babel использует объект `arguments` для необязательных параметров?

Я заметил несколько странное решение по транспиляции от babel в отношении необязательных параметров. Следующий код ES6:

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

переносится на

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

Вскоре мне предстоит провести презентацию о том, насколько короче и лаконичнее синтаксис ES6 и как он будет выглядеть в ES5 (обычно через Babel). Но для меня это кажется несколько вынужденным, а также гораздо менее эффективным. Есть ли причины не делать этого ?:

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

person iuliu.net    schedule 11.06.2017    source источник
comment
да. Представьте себе функцию, в которой вы передадите undefined в качестве аргумента. Вот почему необходима проверка длины.   -  person Jared Smith    schedule 11.06.2017
comment
@JaredSmith: если вы передадите undefined в качестве значения параметра со значением по умолчанию, будет использоваться значение по умолчанию, а не undefined.   -  person T.J. Crowder    schedule 11.06.2017
comment
Для вашей презентации я бы не стал сравнивать синтаксис ES2015 с тем, как выглядит эквивалент ES5 при переносе. Вместо этого я бы сравнил синтаксис ES2015 с тем, что вы на самом деле написали бы в ES5, что вряд ли будет очень похоже на то, что делает Babel во многих случаях (посмотрите, в частности, что он делает с class). Это более информативно с точки зрения реальных преимуществ нового синтаксиса. Я думаю, мы все можем согласиться с тем, что ваш первый блок кода, приведенный выше, более краток, чем ваш последний (и многие также утверждают, что это яснее, но это более субъективно).   -  person T.J. Crowder    schedule 11.06.2017
comment
Вы правы, это моя цель в основном, но если бы я должен был протестировать необязательные параметры в babel, и кто-то сказал бы, что это неправда, это можно было бы написать более коротким способом, я бы теперь знал, что сказать.   -  person iuliu.net    schedule 11.06.2017
comment
Цель Babel - не быть кратким, а соответствовать спецификациям.   -  person Felix Kling    schedule 11.06.2017
comment
Кто-то недавно запросил именно это изменение как свободный вариант для соответствующего плагина. Я сделал для этого пиар здесь github.com/babel/babel/pull/5778, неплохо идет. Было бы интересно, если это то, что вы себе представляли.   -  person Mauro Bringolf    schedule 12.06.2017


Ответы (1)


Есть ли причины не делать этого?

Это противоречило бы спецификации, в которой говорится, что арность (.length) функции - это количество объявленных параметров перед первым параметром со значением по умолчанию или остальным параметром. (Это определение начинается здесь; доводить дело до конца - это ... весело. Но это то, к чему все сводится.)

Ваш myFunction не имеет объявленных параметров до первого со значением по умолчанию и, следовательно, имеет length == 0. Если бы он был передан так, как вы предлагаете, вместо него было бы length == 2, что было бы нарушением спецификации.

person T.J. Crowder    schedule 11.06.2017