为什么更改变量名会改变prompt()的行为

时间:2016-12-27 03:44:50

标签: javascript

使用185.124.86.73 - - [27/Dec/2016:06:39:04 +0300] "POST /wp-login.php HTTP/1.0" 500 - "-" "-" 185.124.86.73 - - [27/Dec/2016:06:39:04 +0300] "POST /wp-login.php HTTP/1.0" 500 - "-" "-" 185.124.86.73 - - [27/Dec/2016:06:39:04 +0300] "POST /wp-login.php HTTP/1.0" 500 - "-" "-" 185.124.86.73 - - [27/Dec/2016:06:39:04 +0300] "POST /wp-login.php HTTP/1.0" 500 - "-" "-" 185.124.86.73 - - [27/Dec/2016:06:39:04 +0300] "POST /wp-login.php HTTP/1.0" 500 - "-" "-" 185.124.86.73 - - [27/Dec/2016:06:39:04 +0300] "POST /wp-login.php HTTP/1.0" 500 - "-" "-" 185.124.86.73 - - [27/Dec/2016:06:39:05 +0300] "POST /wp-login.php HTTP/1.0" 500 - "-" "-" 185.124.86.73 - - [27/Dec/2016:06:39:05 +0300] "POST /wp-login.php HTTP/1.0" 500 - "-" "-" 185.124.86.73 - - [27/Dec/2016:06:39:05 +0300] "POST /wp-login.php HTTP/1.0" 500 - "-" "-" 185.124.86.73 - - [27/Dec/2016:06:39:05 +0300] "POST /wp-login.php HTTP/1.0" 500 - "-" "-" 185.124.86.73 - - [27/Dec/2016:06:39:05 +0300] "POST /wp-login.php HTTP/1.0" 500 - "-" "-" 简单示例如下:

prompt

使用此代码,无论是单击“确定”,还是单击“取消”,或通过单击所有在Chrome开发工具中看到<!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> 的交叉项来关闭提示框。但是,如果您将problem!!!更改为其他内容......

name

...然后<!DOCTYPE html> <html lang="en"> <head></head> <body> <script> var randomName = prompt("Please enter your name"); if (randomName != null) { console.log('problem!!!'); } </script> </body> </html> 仅在您单击“确定”时显示。怎么可能?为什么更改problem!!!函数的变量名称更改行为?

4 个答案:

答案 0 :(得分:3)

你可能正在运行&#34;更好地避免&#34;标识符问题: See here

在Chrome和Edge(14)上尝试将name设置为prompt的结果(在esc之后,取消,x)会导致name设置为字符串{{1而不是"null"。 IE 11将null设置为null。

但如果您确实按了OK,则name将设置为您输入的内容。

其他变量名称实际上被设置为name作为esc,cancel,x的结果。

答案 1 :(得分:1)

原因是“名称”是全球窗口中悬挂的全球。默认值为“”,不为null。 即使用户点击取消,第一个表单也会定义名称(它根本不会重置它)。 第二种形式使用尚未定义的变量,因此如果取消,它将获得null值。

答案 2 :(得分:1)

namewindow上的全局变量 并且var name未重置或重新声明。它仍然引用window.name

你无法设置window.name = null。 DOM会将其设为"null",因为它必须与DOM规范中的string一样。

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

为避免此问题,ES6会引入let

let name;
console.log( typeof name ); //<- you got "undefined"
name = null;
console.log( typeof name ); //<- you got "object"
console.log( name );        //<- you got null as expected.

有关详细信息What's the difference between using "let" and "var" to declare a variable?

,请参阅此处

答案 3 :(得分:0)

您在此处创建全局范围内的name变量,但name范围内已存在window属性,这是默认范围。您可以使用

检查该属性
Object.getOwnPropertyDescriptor(window, 'name')

在这里,您可以看到该名称有自己的gettersetters,因此即使您为其指定任何值,其setter也会将其转换为字符串。因此

name = 34; // will save '34' to it not Integer

第二种情况randomNumber变量未在globalwindow范围内定义,因此按预期工作。

在你的情况下name被设置为null但被保存为string,即

name; // 'null'

因此,if未正确执行。

有关name的{​​{1}}属性的更多信息,请阅读here