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

今天当我用==做了一些实验时,我不小心发现"\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

这种行为可能令人惊讶,但可以通过查看规范来解释。

我们必须看看与等号运算符进行比较时会发生什么。 确切的algorithm在11.9.3节中定义。


string == integer

我们必须看的一步是#5:

5.如果Type(x)是String而Type(y)是Number,
返回比较结果ToNumber(x) == y

这意味着string"\n""\r""\t" )被转换为数字,然后与0进行比较。

如何将string转换为数字? 这在9.3.1节中有解释。 总之,我们有:

StringNumericLiteral ::: StrWhiteSpace的MV(math值)是0

StrWhiteSpace被定义为

 StrWhiteSpace ::: StrWhiteSpaceChar StrWhiteSpace_opt StrWhiteSpaceChar ::: WhiteSpace LineTerminator 

这只是意味着包含空白字符和/或行结束符的string的数值是0
7.3节定义了哪些字符被认为是空白字符。


string == boolean

我们必须看的一步是#7:

7.如果Type(y)是布尔型,则返回比较结果x == ToNumber(y)

如何将布尔转换为数字非常简单: true变为1false变为0

之后,我们正在比较一个string与数字,这是上面解释。


正如其他人所说,严格比较( === )可以用来避免这个“问题”。 其实你只应该使用正常的比较,如果你知道你在做什么,并希望这种行为。

由于JavaScript是一种松散types的语言,因此它会尝试将对比的第一面与其他对象进行types转换,以使它们相互匹配。

任何不包含数字的string,与整数相比变成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.' 

顺便说一下, 声明的variables可能是undefined (例如var txt; )。

如果你进行更严格的比较(没有强制types,使用=== ),你会看到

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

也可以看看

原因是"\n\t\r"就像" "一样被视为空string。 如果您使用==它将返回true但如果您使用===它将返回false

如果你想testing的存在,你应该使用类似的东西

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

每当使用== operator并尝试将一个string与一个数字进行比较时,该string将首先转换为一个数字。 因此: alert("\n\r"==0) becomes: alert(Number("\n\r")==0)数字结构是有趣的。 它将首先删除空格,然后决定数字是不是一个数字或不。 如果是NaN ,那么结果是“ NaN ”。 如果string为空,则结果为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));