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

Javascript '\n\t\r';==0是真的吗?,javascript,Javascript,今天当我用=做一些实验时,我意外地发现“\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 这毫无

今天当我用
=
做一些实验时,我意外地发现
“\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.");
}
它给我的是
变量没有声明。


它如何等于
0
,或
false

因为JavaScript是一种松散类型的语言,它试图将比较的第一个方面与另一个方面进行类型转换,以便它们相互匹配

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


txt
不是
布尔值
,因此它永远不会是
。但它可以是未定义的

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.'
顺便说一下,声明的变量可能是
未定义的
(例如
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*/
}

这种行为可能令人惊讶,但可以通过查看

我们必须看看当与进行比较时会发生什么。精确的算法在中定义

我构建了一个简单的工具来演示执行哪些算法步骤:


string==integer
我们必须考虑的步骤是#5:

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

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

字符串如何转换为数字?这一点在本文中进行了解释。简言之,我们有:

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

其中,
StrWhiteSpace
定义为

StrWhiteSpace :::
    StrWhiteSpaceChar StrWhiteSpace_opt

StrWhiteSpaceChar :::
    WhiteSpace
    LineTerminator
这只意味着包含空格字符和/或行结束符的字符串的数值为
0

中定义了哪些字符被视为空白字符


string==boolean
我们必须考虑的步骤是#7:

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

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

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



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

每当您使用
==运算符
并尝试将字符串与数字进行比较时,该字符串将首先转换为数字。因此:
alert(“\n\r”==0)变为: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()

但是请注意,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));

。我会说“因为字符串是空的”@Mehrdad-LOL,它用JavaScript
0.1+0.2-->0.30000000…4
表示,我不相信,我尝试了,得到了同样的结果。以前从来没有注意过@德里克:这是你在使用IEEE浮点数的每种语言中都会看到的一些行为(这是关于每种语言的),还有:这不是一个bug,这是一个特性!你的答案有点让人困惑——如果将一个字符串与一个字符串进行比较,它肯定仍然是一个字符串(也许你想在那里说“数字”)。关于“任何不包含数字的字符串,与整数相比都变成了0”,你如何解释
“abc”==0//false
如果不是空字符串,则与布尔值相比,“
”0“==false
将产生
true
。根据您的解释,
”0“
将转换为
true
,因此它将产生
false
。事实上,两个操作数都首先转换为数字,然后进行比较。请注意,将字符串与布尔值进行比较与将字符串作为布尔值进行计算是有区别的。实际上@FelixKling可能应该提到
“string”==0
基本上被解释为
数字(“string”)==0
。出于某种原因,空格字符串被转换为0,而带有字符的字符串被转换为
NaN
==禁用类型转换,因此即使是
txt!==false
会给出
true
这一点。我认为JavaScript不能接受这些引号作为字符串分隔符。你错了,只有“”是空字符串,而“”不是。尝试
if(“”)警报(“hi”)
查看它的作用。
==0
使用node.js返回
true
,这是正确的,因为“”是一个字符串-如果您将其与数字(0是什么)进行比较,它也将在比较之前转换为数字
var nan=Number("geh");
alert(isNaN(nan)&& isNaN(nan));