Javascript 带&&;和.长度
我想知道,当我将两个if条件组合在一起时,为什么控制台会说“无法读取未定义的属性”lengthJavascript 带&&;和.长度,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
//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];
}