Javascript 带&&;和.长度

Javascript 带&&;和.长度,javascript,arrays,if-statement,operators,Javascript,Arrays,If Statement,Operators,我想知道,当我将两个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 combi

我想知道,当我将两个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]; 
}  
//两个if由&&组合后:
对于(n=0,len=i.length;n最长长度)
最长=n[i];
}
//在合并两个if之前:
对于(n=0,len=i.length;n longest.length)longest=n[i];
}  

我猜是因为
n[I]
未定义或
最长的
未定义,而且
n[I]
从来不是字符串类型

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

在您的第二段代码中,第二个测试从未到达,因为正如我刚才推测的,第一个测试
typeof n[I]!='字符串“
返回true,因此它总是运行
continue语句,因此它永远不会计算第二个表达式,您也永远不会看到错误。但它仍然在那里


Edit:正如@omarrelawady深刻指出的那样,您实际上是在给
n
分配一个整数,整数不能作为数组索引。因此,
n[i]
肯定是未定义的。(
longest
可能也未定义;我们无法从您的代码中分辨出来。)+1到@OmarElawady。

我猜是因为
n[I]
未定义或
longest
未定义,
n[I]
从来都不是字符串类型

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

在您的第二段代码中,第二个测试从未到达,因为正如我刚才推测的,第一个测试
typeof n[I]!='字符串“
返回true,因此它总是运行
continue语句,因此它永远不会计算第二个表达式,您也永远不会看到错误。但它仍然在那里


Edit:正如@omarrelawady深刻指出的那样,您实际上是在给
n
分配一个整数,整数不能作为数组索引。因此,
n[i]
肯定是未定义的。(
longest
可能也未定义;我们无法从您的代码中分辨出来。)+1到@OmarElawady。

我猜是因为
n[I]
未定义或
longest
未定义,
n[I]
从来都不是字符串类型

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

在您的第二段代码中,第二个测试从未到达,因为正如我刚才推测的,第一个测试
typeof n[I]!='字符串“
返回true,因此它总是运行
continue语句,因此它永远不会计算第二个表达式,您也永远不会看到错误。但它仍然在那里


Edit:正如@omarrelawady深刻指出的那样,您实际上是在给
n
分配一个整数,整数不能作为数组索引。因此,
n[i]
肯定是未定义的。(
longest
可能也未定义;我们无法从您的代码中分辨出来。)+1到@OmarElawady。

我猜是因为
n[I]
未定义或
longest
未定义,
n[I]
从来都不是字符串类型

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

在您的第二段代码中,第二个测试从未到达,因为正如我刚才推测的,第一个测试
typeof n[I]!='字符串“
返回true,因此它总是运行
continue语句,因此它永远不会计算第二个表达式,您也永远不会看到错误。但它仍然在那里


Edit:正如@omarrelawady深刻指出的那样,您实际上是在给
n
分配一个整数,整数不能作为数组索引。因此,
n[i]
肯定是未定义的。(
longest
也可能未定义;我们无法从您的代码中分辨出来。)+1到@omarRelaway。

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

在最后一个循环中:
typeof n[i]!='字符串“
始终为true,因为typeof n[i]等于未定义


但在第一个示例中,n[i]是未定义的,因此当您尝试访问未定义的

n的length属性时,浏览器会抛出错误,因此n[i]是未定义的整数

在最后一个循环中:
typeof n[i]!='字符串“
始终为true,因为typeof n[i]等于未定义

但在第一个示例中,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]; 
}  
for(n= 0, len=i.length; n<len; n++) {
 if(typeof n[i] !== 'string' && n[i].length > longest.length) 
 longest = n[i];
}