Ответ 1

С ES6: теперь это часть языка:

function myFunc(a, b = 0) {
   // function body
}

Пожалуйста, имейте в виду, что ES6 проверяет значения по undefined а не по истинности (поэтому только действительные неопределенные значения получают значение по умолчанию - ложные значения, такие как ноль, не будут по умолчанию).


С ES5:

function myFunc(a,b) {
  b = b || 0;

  // b will be set either to b or to 0.
}

Это работает до тех пор, пока все значения, которые вы явно передаете, являются правдивыми. Значения, которые не соответствуют действительности в соответствии с комментарием MiniGod: null, undefined, 0, false, ''

Довольно часто можно увидеть, как библиотеки JavaScript выполняют несколько проверок необязательных входных данных перед тем, как функция действительно запустится.

Ответ 2

Update

С ES6 это возможно точно так, как вы описали; подробное описание можно найти в документации.

Старый ответ

Параметры по умолчанию в JavaScript могут быть реализованы главным образом двумя способами:

function myfunc(a, b)
{
    // use this if you specifically want to know if b was passed
    if (b === undefined) {
        // b was not passed
    }
    // use this if you know that a truthy value comparison will be enough
    if (b) {
        // b was passed and has truthy value
    } else {
        // b was not passed or has falsy value
    }
    // use this to set b to a default value (using truthy comparison)
    b = b || "default value";
}

Выражение b || "default value" оценивает значение AND существование b и возвращает значение "default value", если b либо не существует, либо является ложным.

Альтернативное объявление:

function myfunc(a)
{
    var b;

    // use this to determine whether b was passed or not
    if (arguments.length == 1) {
        // b was not passed
    } else {
        b = arguments[1]; // take second argument
    }
}

Внутри функции имеется специальный "массив" arguments; он содержит все аргументы, начиная с индекса 0 до N - 1 (где N - количество переданных аргументов).

Обычно это используется для поддержки неизвестного количества необязательных параметров (одного типа); однако предположение о том, что ожидаемые аргументы являются предпочтительными!

Дальнейшие соображения

Хотя undefined не записывается с ES5, некоторые браузеры, как известно, не применяют это. Есть две альтернативы, которые вы можете использовать, если вы беспокоитесь об этом:

b === void 0;
typeof b === 'undefined'; // also works for undeclared variables