我想知道为什么控制台说'无法读取属性'长度'未定义的'当我将两个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];
}
答案 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'
是正确的。