当迭代对象与IE兼容时,是否真的需要obj.hasOwnProperty(key)?

时间:2013-12-21 19:59:43

标签: javascript jquery internet-explorer

为了兼容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的解决方案?

2 个答案:

答案 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 correctlynot to vandalize prototypes。只有当您使用可编码的第三方模块时才需要注意,而这些模块是您无法忽略的。