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

时间:2012-04-29 21:34:22

标签: javascript

今天当我用==进行一些实验时,我意外地发现了"\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 ???

5 个答案:

答案 0 :(得分:39)

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

我们必须查看与equals operator进行比较时会发生什么。确切的算法在section 11.9.3中定义。


string == integer

我们要看的步骤是#5:

  

5。如果Type(x)是字符串而Type(y)是数字,则   返回比较结果ToNumber(x) == y

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

字符串如何转换为数字?这在section 9.3.1中有解释。简而言之,我们有:

  

StringNumericLiteral ::: StrWhiteSpace的MV(数学值)为0

其中StrWhiteSpace定义为

StrWhiteSpace :::
    StrWhiteSpaceChar StrWhiteSpace_opt

StrWhiteSpaceChar :::
    WhiteSpace
    LineTerminator

这仅表示包含空格字符和/或行终止符的字符串的数值为0
section 7.3中定义了哪些字符被视为空白字符。


string == boolean

我们要看的步骤是#7:

  

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

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

之后我们将字符串与数字进行比较,如上所述。


正如其他人所提到的,可以使用严格比较(===)来避免这个“问题”。实际上,如果您知道自己在做什么并且想要这种行为,那么您应该只使用正常比较。

答案 1 :(得分:12)

因为JavaScript是一种松散类型的语言,它会尝试将比较的第一面输入到另一侧,以便它们相互匹配。

与整数相比,任何不包含数字的字符串都变为0,并且与布尔值相比时变为真(除非在某些情况下)。

<强> Light reading material.

答案 2 :(得分:4)

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

See also

答案 3 :(得分:1)

原因是"\n\t\r"就像" "被视为空字符串一样。 如果您使用==,则会返回true,但如果您使用===,则会返回false

如果你想测试存在,你应该使用像

这样的东西
if(typeof strName !== 'undefined') {
    /*do something with strName*/
} else {
    /*do something without it*/
}

答案 4 :(得分:1)

每当您使用== operator并尝试将字符串与数字进行比较时,字符串将首先转换为数字。因此:alert("\n\r"==0) becomes: alert(Number("\n\r")==0) 数字结构很有意思。它将首先删除空格,然后确定该数字是否不是数字。如果是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));