'\ 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
变为1
, false
变为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));