在for循环中:counter< (x.lenght)拼写错误,但函数返回零。当更正为x.length时,函数返回正确的B数,3。1)为什么返回零? 2)为什么javascript没有捕获到这个错误? 3)对于未来,我可以采取哪些措施来确保捕获这些类型的错误?
function countBs(x){
var lCounter = 0;
for (var counter = 0; counter < (x.lenght); counter++){
if((x.charAt(counter)) == "B"){
lCounter++;
}
}
return lCounter;
}
console.log(countBs("BCBDB"));
答案 0 :(得分:6)
访问x.lenght
正在返回undefined
,导致for
循环立即终止。因此,返回lCounter
的初始值。
您可以使用in
关键字检查对象中是否存在属性,如下所示:
if ( 'lenght' in x ) {
...
答案 1 :(得分:3)
x.lenght
正在返回undefined
。比较运算符执行自动类型杂耍,因此undefined
将转换为数字以执行比较,并转换为NaN
。与NaN
的任何比较都会返回false
,因此循环结束。
Javascript没有捕获此错误,因为它使用松散类型,在大多数情况下根据需要自动转换类型。
没有简单的方法可以确保捕获这样的拼写错误。如果您提供良好的类型注释,一个好的IDE可能能够检测到它。
答案 2 :(得分:0)
JavaScript会做各种疯狂的事情,而不是抛出错误:https://www.w3schools.com/js/js_type_conversion.asp
特别是'undefined'在必要时变成NaN(最后一个表的最后一行),与数字相比会导致'false'(无论&lt ;,&gt;,&lt; =,&gt; =,==或!=,它们都失败了,NaN甚至不等于它自己。)
答案 3 :(得分:0)
如果要捕获或记录错误以确保定义了变量属性。请参阅以下代码:
function countBs(x){
var lCounter = 0;
if(typeof x.lenght == 'undefined')
{
console.log('Undefined poperty lenght on variable x');
return 'Error catch';
}
for (var counter = 0; counter < (x.lenght); counter++){
if((x.charAt(counter)) == "B"){
lCounter++;
}
}
return lCounter;
}
console.log(countBs("BCBDB"));
答案 4 :(得分:0)
要捕获此特定错误,请将lCounter
设置为-1而不是0。
如果 for
条件正确,那将确保循环至少运行一次。
如果未输入循环,则可以返回(或抛出)错误。
否则,返回lCounter + 1
以考虑初始化-1。
function countBs(x) {
var lCounter = -1;
for (var counter = 0; counter < (x.lenght); counter++) {
if((x.charAt(counter)) == "B") {
lCounter++;
}
}
if(lCounter == -1) {
return 'Error';
} else {
return lCounter + 1;
}
}