如果声明与&&和.length

时间:2015-04-07 18:55:45

标签: javascript arrays if-statement operators

我想知道为什么控制台说'无法读取属性'长度'未定义的'当我将两个if条件组合在一起时?

//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]; 
}  

4 个答案:

答案 0 :(得分:2)

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

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);

答案 1 :(得分:1)

n是一个整数,因此n [i]未定义。

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

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

答案 2 :(得分:0)

我猜是因为n[i]未定义或longest未定义,n[i]永远不属于字符串类型。

在你的第一段代码中,你是两个测试的逻辑和运算。如果我的争论是正确的,那么&&的LHS将返回true。虽然&&提供了短路行为,但这不适用于此,因为您有true && ...,因此必须对...进行测试以确定结果。因此,必须评估表达式n[i].length > longest.length,这将触发错误。

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

编辑:正如@OmarElawady深刻地指出的那样,你实际上是在为continue;分配一个整数,并且整数不能被索引为数组。因此,n肯定是未定义的。 (n[i]也可能未定义;我们无法从您的代码中说明。)+ @OmarElawady。

答案 3 :(得分:0)

陈述不一样。

首先,n [i]永远不会是一个字符串。 n是整数。 typeof n [i]将返回&#39; undefined&#39;。

那就是说,在接下来的循环中

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'是正确的。