Search code examples
javascriptjsonfunctionobjectarguments

Multiple arguments vs. options object


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.


Solution

  • 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