Javascript 递归提示返回未定义的

Javascript 递归提示返回未定义的,javascript,Javascript,今天早上,当我试图实现一个无休止的提示系统时,我注意到了一些非常奇怪的事情 以下代码在两种情况下返回两个不同的输出: 场景1:在第一次提示时输入数字,然后确定 输出1:输入的编号 场景2:先取消提示,然后输入数字并确认 输出2:未定义 function Prompt() { var input = prompt("Enter a number", ""); if(input === null || input === "" || input === undefined || isNaN

今天早上,当我试图实现一个无休止的提示系统时,我注意到了一些非常奇怪的事情

以下代码在两种情况下返回两个不同的输出:

场景1:在第一次提示时输入数字,然后确定

输出1:
输入的编号


场景2:先取消提示,然后输入数字并确认

输出2:
未定义

function Prompt()
{
  var input = prompt("Enter a number", "");
  if(input === null || input === "" || input === undefined || isNaN(input))
      return Prompt();
  else
      return input;
}

我不明白为什么会这样。首先,当我在if语句中检查未定义时,如何返回未定义?其次,我的印象是,在JavaScript中,未定义意味着一个变量已声明,但尚未赋值,在本例中,我赋值的是
var编号

var number=null;
数字=提示符();
$(“p”).html(“数字是”+数字);
函数提示符()
{
var input=提示(“输入一个数字”);
如果(输入===null | |输入===“”| |输入===未定义| | isNaN(输入))
提示();
其他的
返回输入;
}


只有一个代码路径返回值,使其从递归调用返回。在JavaScript中,如果函数结束时没有返回语句,则其返回值为
undefined

function Prompt()
{
  var input = prompt("Enter a number", "");
  if(input === null || input === "" || input === undefined || isNaN(input))
      return Prompt();
  else
      return input;
}

当第一个提示被取消时,会调用另一个prompt()迭代,但它的返回值不会在任何地方被捕获。然后,第一次迭代返回原始未定义的返回值

穆萨的回答显示了解决这一问题的一种方法。另一个是:

function Prompt() {
    var input = null;
    while(input === null) {
        input = prompt("Enter a number", "");
    }
    return input;
 }

window.prompt
总是返回一个字符串或
null
,所以不要麻烦检查
未定义的
,或
isNaN

此外,由于
window.prompt
返回字符串,因此需要使用
window.parseInt
将其可靠地转换为数字

函数提示符(){
var n=window.parseInt(window.prompt(“输入数字”),10)
if(编号:isNaN(n))
返回提示符()
其他的
返回n
}

警报(“您的号码是:“+Prompt())
您应该提到,
Prompt
只返回一个字符串
isNaN('anystring')
将始终返回
true
,而
Number.isNaN
仅在
输入
实际为
NaN
时返回
true
。建议
parseInt
等@naomik:不正确
isNaN(“”===false
我不知道它为什么返回false,但是也许你可以试试
isNaN(parseFloat(input))
@ThomasF谢谢,我不知道,我只想记住
window.isNaN
是一块垃圾
Number.isNaN
更易使用。感谢您澄清它返回未定义的原因,我不知道这一点。至于没有返回值的代码路径。。我百分之百的疏忽——我当然知道哈哈哈——失败了。谢谢。事实上你能做到。