Параметры функции по умолчанию

116
04 декабря 2019, 02:40

В стандарте ES-2015 появилась возможность задавать параметры функции по умолчанию, выглядит это так:

function name(name = 'noname') {
  console.log(name);
}
name()

Однако такого же эффекта можно было добиться с помощью хака:

function name(name) {
  var name = name || 'noname'
  console.log(name);
}
name()

При этом Babel транслирует такую функцию вот так:

function name() {
  var name = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'noname';
  console.log(name);
}
name();

Какой вариант правильнее: как предлагает Babel или с использованием логического ||?

Answer 1

Правильнее как бабель, разумеется. Потому что например:

> "" || "default"
-> "default"

и если вы захотите в свою функцию передать пустую строку, то поведение её будет слегка неожиданным.

Answer 2

Логическое ИЛИ подчиняется законам логики. В общем случае такое поведение не подходит. Babel транспилирует не зная ничего о Вашей бизнес логике.

Например, является ли пустая строка валидным значением или её нужно заменить значением по умолчанию? А 0?

let tests = [undefined, null, 0, '', false, NaN]; 
 
const test1 = (a = 42) => a; 
const test2 = (a) => (a=a||42, a); 
 
console.log(tests.map(test1)); 
console.log(tests.map(test2));

Answer 3

правильнее писать не опираясь на babel так как

  1. как говорилось выше babel ничего не знает о вашей логике
  2. и самое главное это babel всего лишь обертка которая в будущем станет не нужна (в идеале) и когда стандарт ES-2015 станет стандартом дефакто то и надобность в babel отпадет
READ ALSO
Отправка определенного div

Отправка определенного div

Есть форма - обычнаяКроме "общих" полей в ней "на лету" генерируются div'ы с вложенными input'ами

106
Как в sql запросе с GROUP BY вычесть разность дат?

Как в sql запросе с GROUP BY вычесть разность дат?

Такая проблема: Есть таблица id(int),user_id(int),data(timestamp)

141
Ошибка при установке MySQL 5.7 Server на этапе Writing configuration file

Ошибка при установке MySQL 5.7 Server на этапе Writing configuration file

Нашёл решение такой же проблемы, но там причина была в том, что не создавалась папка MySQL Server 57 в папке MySQL, но у меня такой ошибки не возникло

169
Мобильная адаптация

Мобильная адаптация

Почему, мобильная адаптация не правильно отображается, может где ошибся, помогите пожалуйста!

159