作为一项学术练习,我正在编写一个函数,它将一个电子邮件地址作为字符串并将其拆分为两个并删除“@”,然后将两个拆分字符串放入一个数组中。放在数组中的两个项目将是本地名称和域名。例如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);
答案 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