2016-12-27 87 views
3

使用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開發工具中,您看到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!!!只有當你點擊OK顯示出來。這怎麼可能?爲什麼更改prompt函數的變量名稱更改行爲?

+0

你應該用'true/false'或空字符串'''''' –

回答

1

name是全局變量windowvar name未被重置或重新聲明它。它仍然是指window.name

而且你不能設置window.name = null。 DOM將使它變爲"null",因爲它必須是string,如在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 

爲了避免這個問題,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

您可能會在「更好地避免」標識問題上運行: See here

在Chrome和邊緣(14)試圖設置nameprompt結果(ESC後,取消X)的結果name被設置爲字符串"null",而不是null。 IE 11將name設置爲空。

但是,如果您實際上按確定,然後name設置爲您輸入的任何內容。

作爲esc,cancel,x的結果,其他變量名稱實際上被設置爲null

+0

測試是的,這就是我認爲的... – Alex

1

原因是「名稱」是從全球窗口升起的全球。默認值是「」,它不爲空。 即使用戶點擊取消,第一個表單也會定義名稱(它不會重置它)。 第二種形式使用一個尚未定義的變量,所以如果取消它將得到值null。

0

在這裏,你正在創建全球範圍內name變量,但已經有name屬性出現在window範圍這是默認的範圍。您可以檢查使用

Object.getOwnPropertyDescriptor(window, 'name') 

在這裏你可以看到這個名字都有自己的gettersetters所以即使你分配給它的任何價值,其制定者將其轉換爲字符串屬性。因此

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

凡在第二種情況下randomNumber變量沒有在globalwindow範圍因此如預期那樣工作定義。

在你的情況name被設定爲null但漸漸另存爲string

name; // 'null' 

因此您if沒有得到正確執行。

欲瞭解更多信息namewindow的財產閱讀here

相關問題