今天当我做一些实验时==,我意外地发现了这一点"\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 ::: StrWhiteSpace是0.
在哪里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成为1和false成为0.
之后我们将字符串与数字进行比较,如上所述.
正如其他人所提到的,严格的比较(===)可以用来避免这个"问题".实际上,如果您知道自己在做什么并且想要这种行为,那么您应该只使用正常比较.
Mad*_*iha 12
因为JavaScript是一种松散类型的语言,它会尝试将比较的第一面输入到另一侧,以便它们相互匹配.
与整数相比,任何不包含数字的字符串都变为0,并且与布尔值比较时变为真(除非在某些情况下).
| 归档时间: |
|
| 查看次数: |
3438 次 |
| 最近记录: |