Javascript 为什么更改变量名会改变prompt()的行为
使用Javascript 为什么更改变量名会改变prompt()的行为,javascript,Javascript,使用prompt的一个极其简单的示例如下: <!DOCTYPE html> <html lang="en"> <head></head> <body> <script> var name = prompt("Please enter your name"); if (name != null) { console.log('problem!!!');
prompt
的一个极其简单的示例如下:
<!DOCTYPE html>
<html lang="en">
<head></head>
<body>
<script>
var name = prompt("Please enter your name");
if (name != null) {
console.log('problem!!!');
}
</script>
</body>
</html>
…然后问题代码>仅在单击“确定”时显示。这怎么可能?为什么更改变量名会改变提示符
函数的行为?您可能运行在一个“最好避免”的标识符问题中:
在Chrome和Edge(14)上,由于提示符
(esc后,取消,x)而试图设置名称
,导致名称
被设置为字符串“null”
,而不是null
。IE 11将name
设置为空
但如果您真的按OK,则name
将设置为您键入的任何内容
其他变量名称实际上设置为null
,这是esc、cancel、x的结果。原因是“name”是从全局窗口提升的全局变量。默认值为“”,不为空。
第一个表单定义了名称,即使用户点击cancel(它只是不会重置它)。
第二个表单使用了一个尚未定义的变量,因此如果取消,它将获得null值。name
是窗口上的全局变量
而var name
不会重置或重新声明它。它仍然是指窗口.名称
并且不能设置window.name=null
。
DOM将改为“null”
,因为它必须是DOM规范中的字符串
var name;
console.log( typeof name ); //<- you got "string here"
name = null;
console.log( typeof name ); //<- you still got "string here"
console.log( name ); //<- you got string "null" not null
有关详细信息,请参见此此处您正在全局范围中创建名称
变量,但窗口
范围中已存在名称
属性,这是默认范围。您可以使用
Object.getOwnPropertyDescriptor(window, 'name')
在这里,您可以看到名称有自己的getter
和setters
,因此,即使您给它赋值,它的setter也会将其转换为字符串。因此
name = 34; // will save '34' to it not Integer
其中,与第二种情况一样,randomNumber
变量未在global
或window
范围内定义,因此该变量按预期工作
在您的情况下,name
被设置为null
,但被保存为string
,即
name; // 'null'
因此,如果
没有得到正确执行,您的
有关窗口的名称属性的详细信息,请阅读。您应该使用真/假
或空字符串”
name = 34; // will save '34' to it not Integer
name; // 'null'