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

Der*_*會功夫 35 javascript

今天当我做一些实验时==,我意外地发现了这一点"\n\t\r" == 0.究竟怎么"\n\t\r"等于0,或false

我做的是:

var txt = "\n";  //new line
txt == 0;        //it gives me true
Run Code Online (Sandbox Code Playgroud)

这真让我恼火.所以我做了更多:

var txt = "\r";  //"return"
txt == 0;        //true

var txt = "\t";  //"tab"
txt == 0;        //true
Run Code Online (Sandbox Code Playgroud)

根本没有意义.怎么会发生?更疯狂的是:

//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.");
}
Run Code Online (Sandbox Code Playgroud)

它给了我什么 Variable is not declared.

怎么等于0,或false???

Fel*_*ing 39

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

我们必须看一下与equals运算符进行比较时会发生什么.确切的算法在11.9.3节中定义.


string == integer

我们要看的步骤是#5:

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

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

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

MV(数学值)StringNumericLiteral ::: StrWhiteSpace0.

在哪里StrWhiteSpace定义为

StrWhiteSpace :::
    StrWhiteSpaceChar StrWhiteSpace_opt

StrWhiteSpaceChar :::
    WhiteSpace
    LineTerminator
Run Code Online (Sandbox Code Playgroud)

这仅仅意味着包含空格字符和/或行终止符的字符串的数值0.7.3节中
定义了哪些字符被视为空格字符.


string == boolean

我们要看的步骤是#7:

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

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

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


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


Mad*_*iha 12

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

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

轻读材料.

  • 这不是一个错误,这是一个功能! (10认同)
  • 你的答案有点令人困惑 - 如果将一个字符串与一个字符串进行比较,它肯定仍然是一个字符串(也许你想在那里说"数字"?). (2认同)
  • 关于*"任何不包含数字的字符串,与整数相比变为0"*,你如何解释`"abc"== 0 // false`然后呢? (2认同)
  • 此声明的第二部分也不正确:*"并且与布尔"*相比,变为真(如果不是空字符串).`"0"== false`产生'true`.根据你的解释,"0"将被转换为"true",所以它应该产生"假".实际上,两个操作数首先被转换为数字然后进行比较.请注意,*比较*一个字符串与布尔值和*评估*一个字符串*作为*布尔值之间存在差异. (2认同)