【问题标题】:JavaScript For... in... returns hasObject?JavaScript For... in... 返回 hasObject?
【发布时间】:2010-11-25 01:40:32
【问题描述】:

就是这样。我在网上看过,也看过 StackOverflow,但没有看到有人在谈论这个。

构造数组时是否正常如:

_e = Array();
_e[0] = 'admin_adv_from_date_month';
_e[1] = 'admin_adv_from_date_day';
_e[2] = 'admin_adv_from_date_year';
_e[3] = 'admin_adv_to_date_month';
_e[4] = 'admin_adv_to_date_day';
_e[5] = 'admin_adv_to_date_year';

当你像这样运行它时:

enableElements : function(elements)
{
        for ( var e in elements )
        {
            hForm.enableElement(elements[e]);
        }
}

在我的代码中,e 设置的最后一件事是“hasObject”。我必须在“enableElement”中实现安全防护​​,因为在这种情况下,e 返回 null,因为“hasObject”变成了一个函数:

enableElement : function(element)
    {
        var e = document.getElementById(element);
        if ( e )
        {
            e.disabled = false;
        }
    }

我在最新的 Safari 上运行它。是的,我知道我可以使用各种替代浏览器,这些浏览器可以做各种奇思妙想,但我在这个项目中使用的是 Safari。

这是正常的浏览器行为吗?为什么会发生这种情况?

【问题讨论】:

  • 啊,是的,我必须使用传统的 for 循环。感谢你们纠正我,让我走上正确的轨道。今天学到了一些东西:-)
  • 刚刚在stackoverflow.com/questions/4261051/… 上写完一篇短篇小说,不要让我再写一篇! :-) 顺便说一句,_e = ['admin_adv_from_date_month','admin_adv_from_date_day','so on']

标签: javascript browser


【解决方案1】:

https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in

for...in

“以任意顺序在对象的所有属性上迭代指定的变量。对于每个不同的属性,执行指定的语句。”

“尽管将其用作迭代数组的方法可能很诱人,但这是个坏主意。”

你不应该使用for...in 来迭代数组,它意味着迭代对象属性。请改用旧的 for (var i = 0; i < arr.length; i++) 循环。

【讨论】:

    【解决方案2】:

    您不应该使用for in 循环遍历数组。
    相反,请使用带有索引的普通 for 循环。

    为了回答这个问题,for in 还将枚举从原型继承的所有方法。

    【讨论】:

      【解决方案3】:

      简单的规则:不要使用for...in迭代一个数组,你是在枚举这个数组,以及它可能拥有的所有额外属性。您应该在这里使用普通的for 循环,如下所示:

      enableElements : function(elements)
      {
          for (var i=0; i<elements.length; i++)
          {
              hForm.enableElement(elements[i]);
          }
      }
      

      【讨论】:

        【解决方案4】:

        对数组使用.length,而不是for..in

        enableElements : function(elements) {
            for (var i=0, l = elements.length; i<l; i++)
            {
                hForm.enableElement(elements[i]);
            }
        

        否则,您可能会枚举通过 Object.prototype 扩展的任何内容。您可以.hasOwnProperty 进行检查,但是当.length 完美时为什么要这样做?

        【讨论】:

          猜你喜欢
          • 2016-06-19
          • 1970-01-01
          • 2017-04-25
          • 2010-09-19
          • 1970-01-01
          • 2011-07-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多