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

时间:2018-02-15 22:44:18

标签: javascript function

在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"));

5 个答案:

答案 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;
  }
}