Установите значение параметра по умолчанию для функции JavaScript - PullRequest
2212 голосов
/ 22 мая 2009

Я бы хотел, чтобы функция JavaScript имела необязательные аргументы, для которых я установил значение по умолчанию, которые используются, если значение не определено (и игнорируются, если значение передается). В Ruby вы можете сделать это так:

def read_file(file, delete_after = false)
  # code
end

Работает ли это в JavaScript?

function read_file(file, delete_after = false) {
  // Code
}

Ответы [ 23 ]

6 голосов
/ 03 августа 2016

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

function read_file(file, delete_after = false) {
    #code
}

В этом примере Edge выдаст ошибку «Expecting ')'»

Чтобы обойти это использование

function read_file(file, delete_after) {
  if(delete_after == undefined)
  {
    delete_after = false;
  }
  #code
}

По состоянию на 08 августа 2016 г. это все еще проблема

3 голосов
/ 15 октября 2017

Согласно синтаксису

function [name]([param1[ = defaultValue1 ][, ..., paramN[ = defaultValueN ]]]) {
   statements
}

Вы можете определить значение по умолчанию формальных параметров. а также проверьте неопределенное значение с помощью функции typeof .

3 голосов
/ 12 августа 2018

ES6: Как уже упоминалось в большинстве ответов, в ES6 вы можете просто инициализировать параметр вместе со значением.


ES5: Большинство из приведенных ответов не достаточно хороши для меня, потому что бывают случаи, когда мне приходится передавать ложные значения, такие как 0, null и undefined, функция. Чтобы определить, является ли параметр неопределенным, потому что это значение, которое я передал вместо неопределенного из-за того, что оно вообще не было определено, я делаю это:

function foo (param1, param2) {
   param1 = arguments.length >= 1 ? param1 : "default1";
   param2 = arguments.length >= 2 ? param2 : "default2";
}
3 голосов
/ 05 июля 2018

Используйте это, если вы хотите использовать последний ECMA6 синтаксис:

function myFunction(someValue = "This is DEFAULT!") {
  console.log("someValue --> ", someValue);
}

myFunction("Not A default value") // calling the function without default value
myFunction()  // calling the function with default value

Это называется default function parameters. Это позволяет формальным параметрам инициализироваться значениями по умолчанию, если не передано значение или неопределенное значение. ПРИМЕЧАНИЕ : он не будет работать с Internet Explorer или более старыми браузерами.

Для максимально возможной совместимости используйте это:

function myFunction(someValue) {
  someValue = (someValue === undefined) ? "This is DEFAULT!" : someValue;
  console.log("someValue --> ", someValue);
}

myFunction("Not A default value") // calling the function without default value
myFunction()  // calling the function with default value

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

3 голосов
/ 08 июня 2018
function helloWorld(name, symbol = '!!!') {
    name = name || 'worlds';
    console.log('hello ' + name + symbol);
}

helloWorld(); // hello worlds!!!

helloWorld('john'); // hello john!!!

helloWorld('john', '(>.<)'); // hello john(>.<)

helloWorld('john', undefined); // hello john!!!

helloWorld(undefined, undefined); // hello worlds!!!
2 голосов
/ 08 августа 2018

Если вы используете ES6+, вы можете установить параметры по умолчанию следующим образом:

function test (foo = 1, bar = 2) {
  console.log(foo, bar);
}

test(5); // foo gets overwritten, bar remains default parameter

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

function test(foo, bar) {
  foo = foo || 2;
  bar = bar || 0;
  
  console.log(foo, bar);
}

test(5); // foo gets overwritten, bar remains default parameter

В приведенном выше синтаксисе используется оператор OR. Оператор OR всегда возвращает первое значение, если оно может быть преобразовано в true, если нет, возвращает значение справа. Когда функция вызывается без соответствующего аргумента, переменная параметра (bar в нашем примере) устанавливается на undefined механизмом JS. undefined Затем преобразуется в false и, таким образом, оператор OR возвращает значение 0.

2 голосов
/ 01 июля 2018

function throwIfNoValue() {
throw new Error('Missing argument');
}
function foo(argValue = throwIfNoValue()) {
return argValue ;
}

Здесь foo () - это функция, у которой есть параметр с именем argValue. Если мы здесь ничего не передадим в вызов функции, то будет вызвана функция throwIfNoValue () и возвращенный результат будет присвоен только одному аргументу argValue Вот как вызов функции может использоваться в качестве параметра по умолчанию. Что делает код более простым и читабельным.

Этот пример взят здесь

1 голос
/ 18 января 2019

Да, использование параметров по умолчанию полностью поддерживается в ES6 :

function read_file(file, delete_after = false) {
  // Code
}

или

const read_file = (file, delete_after = false) => {
    // Code
}

, но до ES5 вы могли бы легко сделать это:

function read_file(file, delete_after) {
  var df = delete_after || false;
  // Code
}

Это означает, что если значение есть, используйте значение, в противном случае используйте второе значение после операции ||, которая делает то же самое ...

Примечание: также существует большая разница между ними, если вы передаете значение в ES6 один, даже если значение будет ложным, которое будет заменено новым значением, что-то вроде null или "" ... но ES5 один будет заменен только в том случае, если только переданное значение является правдивым, потому что способ || работает ...

1 голос
/ 10 октября 2018

Если по какой-то причине вы не на ES6 и , используя lodash, то это краткий способ задания параметров функции по умолчанию через _.defaultTo метод:

var fn = function(a, b) {
  a = _.defaultTo(a, 'Hi')
  b = _.defaultTo(b, 'Mom!')

  console.log(a, b)
}

fn()                 // Hi Mom!
fn(undefined, null)  // Hi Mom!
fn(NaN, NaN)         // Hi Mom!
fn(1)                // 1 "Mom!"
fn(null, 2)          // Hi 2
fn(false, false)     // false false
fn(0, 2)             // 0 2
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

Который будет устанавливать значение по умолчанию, если текущее значение равно NaN , null или undefined

0 голосов
/ 13 июня 2019

Просто другой подход для установки параметров по умолчанию состоит в том, чтобы использовать объектную карту аргументов, а не аргументы напрямую. Например,

const defaultConfig = {
 category: 'Animals',
 legs: 4
};

function checkOrganism(props) {
 const category = props.category || defaultConfig.category;
 const legs = props.legs || defaultConfig.legs;
}

Таким образом, аргументы можно легко расширять и не беспокоиться о несоответствии длины аргумента.

...