或for for循环导致无限循环

时间:2014-02-05 15:26:20

标签: javascript loops conditional-operator

作为一项学术练习,我正在编写一个函数,它将一个电子邮件地址作为字符串并将其拆分为两个并删除“@”,然后将两个拆分字符串放入一个数组中。放在数组中的两个项目将是本地名称和域名。例如bob@yahoo.com将成为array = ['bob','yahoo.com']。我正在避免使用split()方法和regEx进行此练习。

我的代码在条件的底部for循环中断开。条件中的||导致无限循环。我已经尝试了每个条件,循环运行正常。但是我需要条件中的两个语句(因为它检查电子邮件末尾的空格以及是否没有空格)。

我尝试过交换条件,但无法找到导致无限循环的原因。为什么代码在这里破解,怎么解决?

var email = ' paul@hotmail.com ';

function checkE(email) {
  var arr = [];
  var local = '';
  var domain = '';
  var i = 0;

  while(email[i] == ' ') {

      i++
  }

for(var j = i; email[j] != '@'; j++) {

    local = local + email[j];
    i++
}
arr.push(local);

for(var k = i+1; email[k] != ' ' ||  k < email.length ; k++) {
    domain = domain + email[k];
}
arr.push(domain);
alert(arr);
}
checkE(email);

3 个答案:

答案 0 :(得分:0)

您的问题出在本声明中:

email[k] != ' '

如果email[k] == ''email[k] == null,则代码会中断。

||替换为&&

由于||

k < email.length

在未到达email的末尾时允许循环运行。然后,

email[k] != ' '

允许循环运行,因为null != ' '

答案 1 :(得分:0)

终止for循环的条件不正确。它应该是

for(var k = i+1; email[k] != ' ' &&  k < email.length ; k++) {
    domain = domain + email[k];
}

请注意,条件(email [k]!=''|| k&lt; email.length)始终为true。假设当k到达email.length - 1然后你有电子邮件[k] ==''但k&lt; email.length。你继续使用k = email.length,此时email [k] == null所以email [k]!=''为真。与k>相同; email.length

答案 2 :(得分:0)

这两个条件中的一个很可能永远是真的。

我们说发电子邮件='paul@hotmail.com'; email.length等于17。

电子邮件[16]等于''因此email[k] != ' '评估为false,但我们尚未达到电子邮件的长度,因此k < email.length为真;所以,我们将进入循环。

email [17]等于null,因此email[k] != ' '的计算结果为true。即使我们已到达字符串的末尾,k < email.length也是假的。

在其他语言(如java)中,您将获得一个IndexOutOfBounds异常,用于访问数组中的索引,该索引大于数组中的元素数。但是,Javascript允许您执行此操作并返回null。

你真正想要的只是在两个条件都是真的情况下进行迭代,而不是一个或另一个。

var length = email.length;
for(var k = i+1; k < length && email[k] != ' '; k++)

关于修剪字符串的这篇文章也可能对您有所帮助/有害:http://blog.stevenlevithan.com/archives/faster-trim-javascript