2015-01-09 132 views
-1

我在JS的冒險開始,所以我有一個問題。我創建了一個小程序,詢問你的名字,然後打印出來。我想知道爲什麼這兩個序列不會給我同樣的結果。如果我不輸入任何東西,這個程序不應該打印任何東西,但是在第一種情況下它會打印出來,我不明白它爲什麼打印。嚴格等於運算符和不等於。爲什麼他們不平等

do { 
    var name = prompt("Who are you?"); 
} while (name === false); 
console.log(name); 

do { 
    var name = prompt("Who are you?"); 
} while (!name); 
console.log(name); 

謝謝:)

+0

提示從不返回false,所以有雅去 – dandavis 2015-01-09 22:20:27

回答

2

提示返回一個字符串,所以名稱變量是一個字符串。

For ===工作,雙方需要是相同的類型。

在這種情況下,左側是一個字符串,右側不是。

+2

或null如果取消... – dandavis 2015-01-09 22:21:02

+0

非常感謝你:)。現在我明白了。 – hex 2015-01-09 22:21:50

1

prompt() will never return false

它可能返回一個空字符串,或null(如果取消/ ESC被使用) - 其中的任一個將滿足while (! name) - 但既不那些是嚴格等於false

+0

非常感謝您! – hex 2015-01-09 22:22:15

0

https://developer.mozilla.org/en-US/docs/Web/API/Window.prompt

語法

結果= window.prompt(文字,值);

結果是一個字符串,其中包含用戶輸入的文本或值爲空。

將您的=== false更改爲=== null並再試一次。底線,window.prompt不會返回布爾值,所以您的嚴格相等性檢查失敗。

+0

謝謝你的回答! – hex 2015-01-09 22:28:17

0

比較將值與布爾值不同從值轉換爲布爾值。

x === false從字面上測試x是否具有值false。但!x轉換爲x爲布爾值。所以這是所執行的兩種不同的操作:

// if (x === false) 
(x === false) === true 

// if (!x) 
(!Boolean(x) === true) 

下一條信息是要懂得不同類型的值轉換爲布爾值。這被定義爲spec。下面是一個摘錄:

nullfalse

undefinedfalse

字符串:結果是false如果參數是空字符串(它的長度是零);否則結果是true

如果不提供值,那麼name將是一個空字符串,這轉換布爾false,而不是價值false

+0

謝謝。我明白了:) – hex 2015-01-09 22:27:59

0

首先,你想運行腳本,而namenull而不是錯誤的權利?

此外,有關平等,注意

true == 1; // correct! 
"2" == 2; // correct! 

雖然

true === 1; // false 
"2" === 2; // false 

這是因爲===意味着恆等。 ==將嘗試在比較發生之前將任一側轉換爲任何等效值。

JSFiddle