簡體   English   中英

'\n\t\r' == 0 是真的嗎?

[英]'\n\t\r' == 0 is true?

今天當我用==做一些實驗時,我偶然發現了"\n\t\r" == 0 "\n\t\r"到底是如何等於0false的?

我所做的是:

var txt = "\n";  //new line
txt == 0;        //it gives me true

這真的讓我很惱火。 所以我做了更多:

var txt = "\r";  //"return"
txt == 0;        //true

var txt = "\t";  //"tab"
txt == 0;        //true

這根本沒有意義。 這是怎么回事? 更瘋狂的是:

//Checking for variable declared or not

var txt ="\n\t\r";
if(txt!=false){
    console.log("Variable is declared.");
}else{
    console.log("Variable is not declared.");
}

它給我的Variable is not declared.

它如何等於0false ???

這種行為可能令人驚訝,但可以通過查看規范來解釋。

我們必須看看在執行與等號運算符的比較時會發生什么。 確切的算法在第 11.9.3 節中定義。

我構建了一個簡單的工具來演示執行了哪些算法步驟: https ://felix-kling.de/js-loose-comparison/


string == integer

我們必須查看的步驟是#5:

5. 如果Type(x)是 String 並且Type(y)是 Number,
返回比較結果ToNumber(x) == y

這意味着字符串"\n""\r""\t" )首先轉換為數字,然后與0進行比較。

字符串如何轉換為數字? 這在第 9.3.1 節中進行了解釋。 簡而言之,我們有:

StringNumericLiteral ::: StrWhiteSpace的 MV(數學值)為0

其中StrWhiteSpace定義為

StrWhiteSpace :::
    StrWhiteSpaceChar StrWhiteSpace_opt

StrWhiteSpaceChar :::
    WhiteSpace
    LineTerminator

這只是意味着包含空格字符和/或行終止符的字符串的數值為0
哪些字符被視為空白字符在第 7.3 節中定義。


string == boolean

我們必須查看的步驟是#7:

7. 如果 Type(y) 為 Boolean,則返回比較結果x == ToNumber(y)

布爾值如何轉換為數字非常簡單: true變為1false變為0

之后我們將一個字符串與一個數字進行比較,這在上面已經解釋過了。


正如其他人所提到的,可以使用嚴格比較( === )來避免這個“問題”。 實際上,如果您知道自己在做什么並且想要這種行為,那么您應該只使用正常比較。

因為 JavaScript 是一種松散類型的語言,它會嘗試將比較的第一方類型轉換為另一方,以便它們相互匹配。

任何不包含數字的字符串在與整數比較時變為 0,在與布爾值比較時變為真(在某些情況下除外)。

輕閱讀材料。

txt不是Boolean ,所以它永遠不會是false的。 雖然它可以是undefined的。

var txt ="\n\t\r";
if(txt !== undefined) { //or just: if (txt)
    console.log("Variable is declared.");
} else {
    console.log("Variable is not declared.");
}
//=> will log: 'Variable is declared.'

順便說一句,聲明的變量可能是undefined的(例如var txt; )。

如果您進行更嚴格的比較(沒有類型強制,使用=== ),您會看到

var txt = '\n'; txt === 0; //=> false
var txt = '\r'; txt === 0; //=> false
var txt = '\t'; txt === 0; //=> false

也可以看看

原因是"\n\t\r"就像" "一樣被視為空字符串。 如果你使用==它將返回true但如果你使用===它將返回false

如果你想測試是否存在,你應該使用類似的東西

if(typeof strName !== 'undefined') {
    /*do something with strName*/
} else {
    /*do something without it*/
}

每當您使用== operator並嘗試將字符串與數字進行比較時,字符串將首先轉換為數字。 因此: alert("\n\r"==0) becomes: alert(Number("\n\r")==0) Number 結構有點有趣。 它將首先去除空格,然后確定數字是否不是數字。 如果NaN ,則結果為“ NaN ”。 如果字符串為空,則結果為 0。

alert(Number()) alerts 0
alert(Number("")) alerts 0
alert(Number(" \n \r \n \t")) alerts 0
alert(Number("blah")) alerts NaN
alert(Number("0xFF")) alerts 255
alert(Number("1E6")) alerts 1000000

要檢查結果是否為 NaN,請使用 isNaN()

Thus: alert(isNaN("blah")) alerts true
Thus: alert(isNaN("")) alerts false
Thus: alert(isNaN("\n")) alerts false
Thus: alert(isNaN(" ")) alerts false

但是請注意,NaN 永遠不會等於 NaN:

var nan=Number("geh");alert(nan==nan);  alerts false 

更新:

如果要檢查雙方是否為 NaN,則首先將兩者都轉換為布爾值,如下所示:

var nan=Number("geh");alert(!!nan==!!nan); alerts true

或者更好

var nan=Number("geh");
alert(isNaN(nan)&& isNaN(nan));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM