2015-12-21 5 views
3

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

def printinfo(name, age = 35): 
    print "Name: ", name 
    print "Age ", age 
    return; 

Тогда функция может быть вызвана как таковой:

printinfo(age=50, name="miki") 
printinfo(name="miki") 

Могут ли такие параметры быть переходящие в функции JavaScript?

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

function plotChart(data, xlabel, ylabel, chart_type="l"){ 
    ... 
} 

Я хочу, чтобы иметь возможность передавать только данные и тип диаграммы и метки не являются обязательными, такие как:

plotChart(data, chart_type="pie") 

Возможно ли это с JavaScript?

+1

google для «необязательных параметров JavaScript» или «параметры с именованием JavaScript». –

+0

Не напрямую. Вы можете проверить, определены ли параметры и жесткий код в ваших функциях. , например. вара предопределенная = функция (пары) { если (пары === неопределенных) { пар = predefinedValue } /* Остальной код здесь идет */ } – Mike

+0

@ Mike, когда-либо слышал о ES6? –

ответ

10

Хороший способ сделать это было бы использовать объект для всех аргументов. Что-то вроде:

function plotChart(options) { 
    // Set defaults 
    options.chart_type = options.chart_type || '1'; 

    // Check if each required option is set 
    // Whatever is used by the data 
} 

Тогда, когда функция вызывается:

plotChart({ 
    data: 'some data', 
    xlabel: 'some xlabel', 
    ylabel: 'some ylabel', 
    chart_type: '5' // This is optional 
}); 
+0

Этот ответ идет за пределы моего, поэтому я рекомендую его. Это также позволяет легко строить параметры. JS не имеет перегрузки, поэтому, если вы ожидаете, что функция будет проходить через большое количество изменений в будущем или займет более 1-2 аргументов, обычно рекомендуется сделать вместо этого объект. +1 – Sinistralis

+0

Это, безусловно, «лучший» вариант и тот, который я использую сейчас. – TheTechy

4

Один из способов - проверить, установлено ли значение параметра undefined, и если да, то присвойте значение.

function plotChart(data, xlabel, ylabel, chart_type) { 
    if (typeof chart_type === 'undefined') { 
    chart_type = 'l'; 
    } 
} 

Также ECMAScript 2016 (ES6) предлагает Default Parameters. Поскольку некоторые браузеры еще не поддерживают эту функцию, вы можете использовать транспилятор, такой как babel, чтобы преобразовать код в ES5.

Чтобы заставить его работать, как в вашем примере на python, вам нужно будет передать объект, содержащий значения, а не отдельные параметры.

function plotChart(options) { 
    var data = options.data; 
    var xlabel = options.xlabel; 
    var ylabel = options.ylabel; 
    var chart_type = (typeof options.chart_type === 'undefined' ? 'l' : options.chart_type); 
} 

Пример использования

plotChart({ 
    xlabel: 'my label', 
    chart_type: 'pie' 
}); 
+0

Полный ответ (который уже существует на SO) покажет классический шаблон 'chart_type = chart_type || "1"; '. –

+5

@torazaburo: Этот шаблон почти всегда в порядке в Ruby, но в JavaScript вам нужно знать о потенциальных значениях переменной, в случае, если значение имеет законное право на одно из значений фальши в своем домене. Обычно это нормально, но вам нужно каждый раз думать об этом; 'if (typeof (chart_type) ==" undefined ") chart_type =" 1 "' является безопасным вариантом. – Amadan

+2

@torazaburo Мне не нравится этот шаблон, потому что в некоторых случаях вы можете действительно передать значение '0', которое будет * falsey *. Думаю, для этого вопроса все нормально, но я не хочу усложнять ситуацию. –

1

Вы можете проверить, если определены параметры и жесткий код, который в свои функции.

например.

var preDefined = function(param) { 
    if(param === undefined) { 
     param = preDefinedValue 
    } 
    /* Rest of code goes here */ 
} 

ETA:

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

Link

3

Там тонна ответов на это уже, но я havn't видел, что я считал самым простым решением этой проблемы.

var myFunc = function(param1) { 
    var someData = param1 || "defaultValue"; 
} 
+2

См. Комментарии в разделе [Ответ Moogs] (http://stackoverflow.com/a/34388663/240443), почему это не здорово. – Amadan

+0

Зависит от того, какие аргументы вы ожидаете, но это, безусловно, действительный момент. Я очень редко разбираюсь со значениями, которые могут быть равны 0, поэтому я часто использую шаблон. В любом случае, случай, безусловно, может быть сделан для того, чтобы не следовать шаблону с исключениями. – Sinistralis

+1

Как я уже сказал, «это нормально, но вам нужно каждый раз думать об этом». Рекомендовать его без оговорки опасно. – Amadan