为了兼容IE,我们决定对数组使用经典的for
循环:
for (var i = 0; i < arr.length; ++i) { ... }
并为对象obj.hasOwnProperty(key)
循环添加for
:
for (var key in obj) {
if (!obj.hasOwnProperty(key)) continue;
...
}
但是......这真的需要吗?
我记得我查看了jQuery源代码,在迭代对象时我没有发现这种情况。
此外,如果答案是是,是否有比将if(!obj.hasOwnProperty(key)) continue;
添加到每个迭代对象更短的解决方案?我的意思是以某种方式重写for
......
要明确:如果不是for (var k in o) { ... }
,我会使用:
foo (o, function (k) {
...
});
function foo (o, callback) {
for (var k in o) {
callback (k);
}
}
我只会在if
函数中添加foo
一次。但是考虑有很多对象for
循环。是否有任何重写for
的解决方案?
答案 0 :(得分:3)
你可以试试这个:
function foo(o, callback) {
var i, k = Object.keys( o );
for (i = 0; i < k.length; ++i)
callback(o[k[i]], k[i]);
}
请注意,可能应该将每个键的值传递给回调,而不仅仅是密钥。如果你只是想在没有辅助函数的情况下迭代一个对象,那么,它就是:
var keys = Object.keys( obj ), value;
for (var i = 0; i < keys.length; ++i) {
value = obj[ keys[ i ] ];
// ...
}
Object.keys()
返回一个数组,因此您可以使用带索引的数组样式迭代。
旧版浏览器中不存在Object.keys()
功能,但您可以使用像the one at the MDN site这样的pollyfill。该函数不返回继承的属性,因此不需要.hasOwnProperty()
测试。
如果您100%确定您的代码永远不会在其他代码修改了各种内置(以及非内置)构造函数的原型对象的上下文中运行,那么您就不要不用担心.hasOwnProperty()
。但是,由于这些问题引入的错误通常非常严重和奇怪,因此可能值得检查。
编辑 - 发烧友版本:
function foo(o, callback) {
Object.keys(o).forEach(function(k) { callback( o[k], k ); });
}
答案 1 :(得分:2)
这不是必需的。
确保代码array loops correctly和not to vandalize prototypes。只有当您使用可编码的第三方模块时才需要注意,而这些模块是您无法忽略的。