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

304
22 июля 2017, 09:05

В стандарте 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 так как

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

Логическое ИЛИ подчиняется законам логики. В общем случае такое поведение не подходит. 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));

READ ALSO
сложные условия оператора if

сложные условия оператора if

В javascript не работает условие:

282
Websockets: Connection closed before receiving a handshake response

Websockets: Connection closed before receiving a handshake response

Я начал использовать React Razzle и всем доволен, только отвалились вебсокетыпишут, что дело в прокси, но я не могу понять, как решить пробему

259
Как получить последний символ из строки?

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

Есть переменная, которая содержит числоХочу просклонять слово в зависимости от числа

251
не передается переменная

не передается переменная

почему то, что выделено жирным не работает, а то, что курсивом - работает?

267