This seems quite convoluted to me. How about something like this;

```js
var gitArgs = options.hasOwnProperty( "gitArgs" ) ? options.gitArgs || "" : "--init --recursive" + merge;
runner.exec( "git submodule update " + gitArgs );
```

That way:
- if you don't have a `gitArgs` option, default is used,
- if you do have a falsy `gitArgs` option (`false` -- obvious favorite for documentation --, `""`, `null`, `undefined`), pure `git submodule update`
- if you do have a non falsy `gitArgs`, it's used as the command line arguments

What do you think?

Oh, also, why naming this variable `params` when those actually are `gitArgs`?