Avoid defaultValue when the default value is a new object.
Updates based on review.

* Throw when required args are undefined.
* Concat strings instead of using a scratch array.