【问题标题】:if statement with && and .length带有 && 和 .length 的 if 语句
【发布时间】:2015-04-07 18:55:45
【问题描述】:

我想知道当我将两个 if 条件组合在一起时,为什么控制台会显示“无法读取未定义的属性 'length'”?

//After two if's combined by &&:
for(n= 0, len=i.length; n<len; n++) {
    if(typeof n[i] !== 'string' && n[i].length > longest.length) 
      longest = n[i];
}


// Before I combine two if's:
for(n= 0, len=i.length; n<len; n++) {
    if(typeof n[i] !== 'string') continue;
    if(n[i].length > longest.length) longest = n[i]; 
}  

【问题讨论】:

  • 检查你的变量命名。您正在使用 n 就像同时是一个数组/字符串和一个数字。
  • 你的两个版本在做完全不同的事情。如果n[i] 不是字符串,第一个比较长度。只有当它是一个字符串时,第二个才会这样做。但是n[i] 将永远是undefined,因为数字不是数组。我认为您的意思是使用i[n],其中i 是一个可能包含一些字符串的数组。
  • 在第一个条件下,如果 n 为零,n[i].length 是多少?

标签: javascript arrays if-statement operators


【解决方案1】:

其他人指出了为什么它不起作用,但没有找到解决方案,因为您的变量名称不是很清楚。也许就是这样:

var i = ['a', 12, 'hello', 'hi', {}, 1.1, 'hey'],
    longest = '';

for(n= 0, len=i.length; n<len; n++) {
    if(typeof i[n] === 'string' && i[n].length > longest.length) longest = i[n];
}

alert('Longest string found: ' + longest);

【讨论】:

  • 其实我把 !== 读错了 === 然后就搞糊涂了....这是一个低级错误。感谢大家澄清它。顺便说一句,你能看看这个解决方案是否也有效吗?它可能比你的慢,但我仍然想知道它是否按预期工作。 codepen.io/anon/pen/yyWxgN
  • @user2734550 Array.sort() 方法不返回任何内容,它改变了它所应用的数组。所以之后你需要pop()。还要确保你的函数名在你的函数调用中是相同的(不是这样)。固定:codepen.io/anon/pen/RNmYpJ
  • 谢谢。最后我有 pop() 。无论如何,我只是想看看是否有任何奇怪的情况会导致这种方式出现问题。
  • @user2734550 只要在检查元素长度之前检查元素是否为字符串,就可以了。
【解决方案2】:

n 是一个整数,所以 n[i] 是未定义的。

在最后一个循环中:typeof n[i] !== 'string' 始终为真,因为 typeof n[i] 等于 undefined

但在第一个 n[i] 中是未定义的,因此当您尝试访问未定义的长度属性时浏览器会抛出错误

【讨论】:

    【解决方案3】:

    我猜是因为n[i] 未定义或longest 未定义,而n[i] 绝不是字符串类型。

    在您的第一段代码中,您对两个测试进行了逻辑与运算。如果我的论点是正确的,那么&amp;&amp; 的 LHS 将返回 true。尽管&amp;&amp; 提供了短路行为,但这并不适用于此,因为您有true &amp;&amp; ...,因此必须测试... 以确定结果。因此,必须计算表达式n[i].length &gt; longest.length,这会触发错误。

    在您的第二段代码中,第二个测试从未到达,因为正如我刚刚推测的那样,第一个测试 typeof n[i] !== 'string' 正在返回 true,因此它始终运行 continue;语句,因此它永远不会计算第二个表达式,并且您永远不会看到错误。但它仍然存在。

    编辑:正如@OmarElawady 有见地指出的那样,您实际上是在为n 分配一个整数,而整数不能作为数组进行索引。因此,n[i] 绝对是未定义的。 (longest 也可能未定义;我们无法从您的代码中看出这一点。)+1 到 @OmarElawady。

    【讨论】:

      【解决方案4】:

      语句不一样。

      首先,n[i] 永远不会是字符串。 n 是一个整数。 typeof n[i] 将返回“未定义”。

      也就是说,在下面的循环中

      for(n= 0, len=i.length; n<len; n++) {
          if(typeof n[i] !== 'string') continue;
          if(n[i].length > longest.length) longest = n[i]; 
      }  
      

      第一个 if 语句将返回 true,因此它将 continue 并且永远不会到达第二个 if 语句。结果没有错误。

      在第二个循环中

      for(n= 0, len=i.length; n<len; n++) {
       if(typeof n[i] !== 'string' && n[i].length > longest.length) 
       longest = n[i];
      }
      

      第一个条件将返回 true (typeof n[i] !== 'string') 因此,将检查第二个条件。 n[i] 未定义,因为 n 是一个整数。

      错误'Cannot read property 'length' of undefined'是正确的。

      【讨论】:

        猜你喜欢
        • 2015-08-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 2012-01-27
        • 2016-08-15
        • 2014-10-26
        相关资源
        最近更新 更多