我正在用JavaScript编写以下函数:

Number.prototype.niceFormat(options) {
    var defaultOptions = {
        thousandSeparator: ',',
        leftPad: 0,
        decimalPlaces: 2
    };
    if (typeof options.thousandSeparator != 'undefined'
    && options.thousandSeparator != null) {
        defaultOptions.thousandSeparator = options.thousandSeparator;
    }

}


麻烦的是我希望选项完全灵活。

如果我调用niceFormat({decimalPlaces: 3}),则defaultOptions属性decimalPlaces会相应替换。

我讨厌写语句的次数与defaultOptions中的属性一样多。

有没有一种很好的方法可以灵活地覆盖defaultOptions中的属性值?

基本上,我正在为JavaScript中的对象寻找一种array_merge

更新:

我从澳航,蜡笔和保罗的评论中得到答案,并写道:

Number.prototype.niceFormat = function(options) {
    var defaultOptions = {
        thousandSeparator: ',',
        leftPad: 0,
        decimalPlaces: 2
    };

    var env = defaultOptions;
    if (typeof options != 'undefined') {
        for (option in env) {
            if (options.hasOwnProperty(option)
            && typeof options[option] != 'undefined') {
                    env[option] = options[option];
            }
        }
    }


无论如何要进一步改善?

最佳答案

您需要做的是检查两个属性都包含该属性,然后分配给它:

for (var i in options) if (options.hasOwnProperty(i) && defaultOptions.hasOwnProperty(i)) defaultOptions[i] = options[i];


hasOwnProperty()检查该属性是否直接在该对象上(而不是通过任何原型或其他方式)以及它是否实际存在于该对象上。

08-08 07:52