[英]Javascript replace regexp \\n with \n, \\t with \t, \\r with \r and so on
[英]'\n\t\r' == 0 is true?
今天當我用==
做一些實驗時,我偶然發現了"\n\t\r" == 0
。 "\n\t\r"
到底是如何等於0
或false
的?
我所做的是:
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.
它如何等於0
或false
???
這種行為可能令人驚訝,但可以通過查看規范來解釋。
我們必須看看在執行與等號運算符的比較時會發生什么。 確切的算法在第 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
變為1
, false
變為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.