对象的正确属性循环
Proper property loop of objects
好。所以到目前为止,我已经"逃脱">使用这样的东西:
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.keys
和forEach
,那么你不需要获得arg
的密钥,只需要获得opt
。这相当于使用Object.keys
和forEach
的第一个代码块。
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
;如果他们这样做了,而他们的替代品没有正常工作,那么你的循环可能是他们最不关心的。
相关文章:
- Javascript:循环属性内部的条件递增或递减
- 在循环中包含特定属性
- 借助for循环和数组在对象中添加属性
- 不可枚举的属性出现在 for..在 Chrome 中循环
- 我们可以设置属性'id'到不同的'按钮'通过使用javascript或jquery的循环
- 如何在循环中设置onclick属性
- 按数据属性循环元素并替换值
- 使用循环增加css属性值
- 循环浏览JavaScript对象并记录其属性
- ..的Javascript..循环中的对象没有在最后一个属性上运行
- 循环访问 JS 数组 + 数组属性
- 如何使用 jQuery 在循环中获取属性的值
- 为for循环中的对象添加新属性
- 在'用于'如果javascript中不存在对象属性,则循环
- Waypoint的循环,退出循环后属性未定义
- 如何循环对象中的javascript对象并查找属性
- 使用循环更新 JSON 属性值
- 未捕获的类型错误: 无法读取未定义的属性“循环”
- 使用点符号和括号显示..内部的属性..循环中
- 对象的正确属性循环