Multiple arguments vs. options object

Christophe picture Christophe · Oct 10, 2012 · Viewed 43k times · Source

When creating a JavaScript function with multiple arguments, I am always confronted with this choice: pass a list of arguments vs. pass an options object.

For example I am writing a function to map a nodeList to an array:

function map(nodeList, callback, thisObject, fromIndex, toIndex){
    ...
}

I could instead use this:

function map(options){
    ...
}

where options is an object:

options={
    nodeList:...,
    callback:...,
    thisObject:...,
    fromIndex:...,
    toIndex:...
}

Which one is the recommended way? Are there guidelines for when to use one vs. the other?

[Update] There seems to be a consensus in favor of the options object, so I'd like to add a comment: one reason why I was tempted to use the list of arguments in my case was to have a behavior consistent with the JavaScript built in array.map method.

Answer

Jeremy J Starcher picture Jeremy J Starcher · Oct 10, 2012

Like many of the others, I often prefer passing an options object to a function instead of passing a long list of parameters, but it really depends on the exact context.

I use code readability as the litmus test.

For instance, if I have this function call:

checkStringLength(inputStr, 10);

I think that code is quite readable the way it is and passing individual parameters is just fine.

On the other hand, there are functions with calls like this:

initiateTransferProtocol("http", false, 150, 90, null, true, 18);

Completely unreadable unless you do some research. On the other hand, this code reads well:

initiateTransferProtocol({
  "protocol": "http",
  "sync":      false,
  "delayBetweenRetries": 150,
  "randomVarianceBetweenRetries": 90,
  "retryCallback": null,
  "log": true,
  "maxRetries": 18
 });

It is more of an art than a science, but if I had to name rules of thumb:

Use an options parameter if:

  • You have more than four parameters
  • Any of the parameters are optional
  • You've ever had to look up the function to figure out what parameters it takes
  • If someone ever tries to strangle you while screaming "ARRRRRG!"