为什么提示返回有时为null为字符串

时间:2016-07-26 18:28:03

标签: javascript

我的一位朋友问我为什么这段代码通过取消提示无法正常工作。

<script type="text/javascript">
    var name = prompt("Enter your name:", "");
    if (!name) {
        name = "unknown";       
    }
    var ans =("<h2>" + "Hello, "+ name + "!"+"</h2>");      
    document.write(ans);        
</script>

这是jsfidle https://jsfiddle.net/085svr3u/

我发现,在上面的示例中,propmt返回&#34; null&#34;即。取消为null作为字符串。我不明白为什么。

我尝试使用原始代码并稍微重构一下。现在它按预期工作。但我仍然没有解释。

<script type="text/javascript">

    function test() {
        var name = prompt("Enter your name:", "");
        if (!name) {
            name = "unknown";       
        }
        var ans =("<h2>" + "Hello, "+ name + "!"+"</h2>");      
        document.write(ans);        
    }

    test();
</script>

这里是修改后的版本https://jsfiddle.net/085svr3u/1/

提前谢谢。

3 个答案:

答案 0 :(得分:4)

这是你的答案

关键字&#39; 名称&#39;在javascript中使用全局范围时会导致问题

如果即使在第一种情况下,您也可以替换名称&#39;与&#39; fname&#39;或其他一些变量名称,它将停止给出null。

<script type="text/javascript">
    var fname = prompt("Enter your name:", "");
    if (!fname) {
        fname = "unknown";      
    }
    var ans =("<h2>" + "Hello, "+ fname + "!"+"</h2>");     
    document.write(ans);        
</script>

在第二种情况下变量&#39; 名称&#39;在函数内部本地创建,它不与 window.name 冲突。因此它运作正常

答案 1 :(得分:4)

@RahulArora基本上提供了正确的答案,但是为了提供更多关于正在发生的事情的启示:

浏览器有一个名为name的内置全局变量,用于存储窗口的名称。如果为其分配值,则分配的值将转换为字符串。这与prompt()无关;你可以这样观察它:

var name = null;
console.log(typeof name);  // "string"
console.log(name.length);  // 4

故事的寓意:避免使用全局变量,除非你绝对不得不这样做,如果你这样做,请确保它们还没有被用于其他东西!

答案 2 :(得分:-1)

您的问题的一行答案是,当用户通过点击取消或按转义来转义提示框时,它会返回null。

有关概念的进一步说明,请阅读: -

这是功能的正式定义:

result = window.prompt(message, default);

结果:是包含用户输入的文字的字符串,或为null。

消息:是要显示给用户的文本字符串。此参数是可选的,如果在提示窗口中没有显示任何内容,则可以省略该参数。

默认值:是一个字符串,其中包含文本输入字段中显示的默认值。这是一个可选参数。 注意在Internet Explorer 7和8中,如果您不提供此参数,则字符串“undefined”是默认值。 (上面来自Mozilla's definition of prompt()

现在我们得出结论:

prompt()返回null或“string”,其中可以包含“”(空字符串)。

现在我们要检查三个州:

null :用户点击了取消或按了Esc。

“”(空字符串):用户点击确定或按Enter键没有文字输入

“string”:用户输入了一些文字。

希望它有所帮助......!