【问题标题】:Javascript 'in' operator inside for loop returns type errorfor循环内的Javascript'in'运算符返回类型错误
【发布时间】:2014-09-05 23:51:14
【问题描述】:

为什么javascript会返回这种类型的错误:

TypeError: Cannot use 'in' operator to search for 'active' in undefined

当我做这样的事情时

foo = [ 
          {link:"http1", active:"true"}, 
          {link:"http2", active:"true"}, 
          {link:"http3"}  
      ]

    var checker = function(){

        for(i=0; i<= foo.length; i++){ 
            if('active' in foo[i]){
                checked = true
            }
        }
    }

但是当我在控制台中使用相同的 foo 对象执行此操作时

'active' in foo[0]

返回真?

【问题讨论】:

  • JavaScript 最佳实践:不要使用in。 JavaScript 一直支持您尝试做的事情,就像 if (foo[i].active) { ... } 一样简单,或者如果属性在命名变量中,假设我们有一个调用“propname”,if (foo[i][propname]) { ... }。为了理智,你可以if (foo[i] &amp;&amp; foo[i].active) { ... }
  • 谢谢。来自 python 似乎很正常,但我明白你在说什么

标签: javascript for-loop typeerror in-operator


【解决方案1】:

错误表明表达式 foo[i] 未定义 - 因为表达式 确实 评估为未定义。 (提示:i = 4)。

这个问题可以用'active' in undefined 重现,不需要循环。

这种情况下的原因是循环条件不正确:它应该是i &lt; foo.length,所以i 变为0..3 而不是0..4。

代码还应该使用本地 i(感谢 RobG!)、break(设置检查时)、从函数返回值(而不是使用假定的全局)和/或替换为Array.some

现在也关闭为“印刷错误”..

【讨论】:

  • 啊,该死的没听懂。是的,有道理,我应该先检查以确保检查的值是真的。
  • 考虑将变量保持在本地,尤其是计数器:for (var i=0, iLen=foo.length, checked=false; i&lt;iLen &amp;&amp; !checked; i++) {checked = !!foo[i] &amp;&amp; 'active' in foo[i]} 或类似的东西。
猜你喜欢
  • 2018-08-02
  • 2021-06-25
  • 2020-09-08
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
相关资源
最近更新 更多