Javascript 函数返回零,但为什么当方法拼写错误时它不会失败?

Javascript 函数返回零,但为什么当方法拼写错误时它不会失败?,javascript,function,Javascript,Function,在for循环中:counter

在for循环中:counter
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"));
访问x.lenght返回未定义,导致for循环立即终止。因此,将返回lCounter的初始值

您可以使用in关键字检查对象中是否存在属性,如:

if ( 'lenght' in x ) {
  ...

JavaScript执行各种疯狂的转换,而不是抛出错误: 特别是当需要时,最后一个表的最后一行中的“undefined”变为NaN,与一个数字比较时,无论,=、==或!=,它们都失败了,NaN甚至不等于它自己。

x.lenght返回未定义。比较运算符执行自动类型转换,因此undefined将转换为数字以执行比较,并转换为NaN。与NaN的任何比较都返回false,因此循环结束

Javascript没有捕捉到这个错误,因为它使用松散类型,在大多数情况下会根据需要自动转换类型


没有简单的方法可以确保像这样的打字错误被发现。如果您提供了良好的类型注释,一个好的IDE可能能够检测到它。

如果您希望捕获或记录错误以确保定义了变量属性。请参阅下面的代码:

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"));
要捕获此特定错误,请将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;
  }
}

除此之外,请参阅有关此错误的未定义属性和错误捕获的说明。请看,除了使用in?x显然是一个字符串之外,还有没有一种方法可以让javascript自动捕获名称错误,因此in对它不起作用。如果有帮助,我建议添加条件typeof。请看一些解释。