对象的正确属性循环

Proper property loop of objects

本文关键字:属性 循环 对象      更新时间:2023-09-26

好。所以到目前为止,我已经"逃脱">使用这样的东西:

function foo(arg) {
    // Default values:
    var opt = { a: 1, b: 2, c: 3 }, 
        key;
    for (key in opt)
        if (opt.hasOwnProperty(key) && arg.hasOwnProperty(key))
           opt[key] = arg[key];
}

现在,我越来越抨击使用hasOwnProperty,因为它可能被一些自定义属性覆盖。

如果我们要使用keys()forEach()等,那么做上述事情的正确方法是什么?像这样的东西?

function bar(arg) {
    // Default values:
    var opt = { a: 1, b: 2, c: 3 }, 
        keys = Object.keys(arg);
    Object.keys(opt).forEach(function(key) {
        if (keys.indexOf(key) !== -1)
            opt[key] = arg[key];
    });
}

如果您担心hasOwnProperty已被覆盖,那么您可以执行:

Object.prototype.hasOwnProperty.call(arg, key)

所以你的原始代码可能是:

function foo(arg) {
    var opt = { a: 1, b: 2, c: 3 },
        check = Object.prototype.hasOwnProperty,
        key;
    for (key in opt) {
        if (check.call(opt, key) && check.call(arg, key)) {
            opt[key] = arg[key];
        }
    }
    return opt;
}

原始代码没有任何问题—除了令人震惊的缺少{}!;-(

如果你觉得出于某种原因需要使用Object.keysforEach,那么你不需要获得arg的密钥,只需要获得opt。这相当于使用Object.keysforEach的第一个代码块。

function bar(arg) {
    // Default values:
    var opt = { a: 1, b: 2, c: 3 };
    Object.keys(opt).forEach(function(key) {
        if (arg.hasOwnProperty(key))
            opt[key] = arg[key];
    });
}

但同样,没有理由更改它,您的原始代码是好的。

现在,我越来越抨击使用hasOwnProperty,因为它可能被一些自定义属性覆盖。

如果有人重写hasOwnProperty,那么理论上他们这样做是有充分理由的。除非在某些特殊情况下,我不会担心。但如果你想避免这种担忧,你可以这样做:

var hop = Object.prototype.hasOwnProperty;
function foo(arg) {
    // Default values:
    var opt = { a: 1, b: 2, c: 3 }, 
        key;
    for (key in opt)
        if (hop.call(opt, key) && hop.call(arg, key))
           opt[key] = arg[key];
}

那么你唯一关心的是是否有人取代了Object.prototype.hasOwnProperty;如果他们这样做了,而他们的替代品没有正常工作,那么你的循环可能是他们最不关心的。