在Javascript中, == ""的结果为true。为什么会这样呢?

35 浏览
0 Comments

在Javascript中, == ""的结果为true。为什么会这样呢?

如果我执行0 == "0",它会返回true。试试看,

if( -777 == "-777" ) alert("same");

弹出提示。

而且,值得注意的是true == "true"并不等于true。试试看,

if( false == "false" ) alert("same");

弹出提示。

为什么会这样呢?

0
0 Comments

在JavaScript中,比较运算符"=="的行为是根据Ecma-262规范中定义的。具体来说,规范中定义了一个抽象的相等比较算法,用于比较两个值x和y是否相等。该算法的步骤如下:

1. 如果x的类型与y的类型不同,则返回false。

2. 如果x的类型是Undefined,则返回true。

3. 如果x的类型是Null,则返回true。

4. 如果x的类型不是Number,则进入第11步。

5. 如果x是NaN,则返回false。

6. 如果y是NaN,则返回false。

7. 如果x和y是相同的数值,则返回true。

8. 如果x是+0且y是-0,或者x是-0且y是+0,则返回true。

9. 返回false。

10. 如果x的类型是String,则返回true当且仅当x和y是完全相同的字符序列(长度相同且对应位置的字符相同)。否则,返回false。

11. 如果x的类型是Boolean,则返回true当且仅当x和y都是true或都是false。否则,返回false。

12. 返回true当且仅当x和y引用同一个对象,或者它们引用彼此连接的对象。否则,返回false。

13. 如果x是null且y是undefined,返回true。

14. 如果x是undefined且y是null,返回true。

15. 如果x的类型是Number且y的类型是String,则返回比较x == ToNumber(y)的结果。

16. 如果x的类型是String且y的类型是Number,则返回比较ToNumber(x) == y的结果。

17. 如果x的类型是Boolean,则返回比较ToNumber(x) == y的结果。

18. 如果y的类型是Boolean,则返回比较x == ToNumber(y)的结果。

19. 如果x的类型是String或Number且y的类型是Object,则返回比较x == ToPrimitive(y)的结果。

20. 如果x的类型是Object且y的类型是String或Number,则返回比较ToPrimitive(x) == y的结果。

21. 返回false。

根据规范的定义,可以看出为什么在JavaScript中," == """会返回true。因为根据步骤11,如果x的类型是String,则返回true当且仅当x和y是完全相同的字符序列。

要解决这个问题,可以使用严格相等运算符"==="代替"=="。严格相等运算符会比较操作数的值和类型,只有当两个操作数的类型和值都相等时才返回true。因此," === """会返回false。

另外,也可以通过先将字符串转换为数字,再进行比较来解决这个问题。例如,可以使用parseInt函数将字符串转换为整数,然后再进行比较。这样," == parseInt("")"会返回true。

总结一下,JavaScript中" == """返回true是因为根据Ecma-262规范的抽象相等比较算法,字符串类型的操作数会被转换为相应的数字类型进行比较。要解决这个问题,可以使用严格相等运算符"==="或先将字符串转换为数字再进行比较。

0
0 Comments

在JavaScript中,当使用"=="比较运算符时,如果操作数是一个整数和一个字符串,JavaScript会将整数转换为字符串,然后进行比较。因此,当执行if(5 == "5")时,JavaScript会将整数5转换为字符串"5",然后比较两个字符串是否相等。

如果使用"==="严格比较运算符,JavaScript会同时比较操作数的值和类型。因此,当执行if(5 === "5")时,JavaScript会发现一个操作数是整数,另一个操作数是字符串,它们的类型不同,所以返回false。

那么为什么JavaScript会在使用"=="比较运算符时将整数转换为字符串呢?这是因为JavaScript的设计初衷是尽可能地进行自动类型转换,以便于开发者编写简洁的代码。然而,这种自动类型转换有时会导致意外的结果,因此在比较值时,最好使用"==="严格比较运算符来避免类型转换的影响。

解决这个问题的方法是使用"==="严格比较运算符来比较操作数的值和类型,以确保比较结果的准确性。这样可以避免因为自动类型转换而导致的意外结果。

总结一下,当使用"=="比较运算符时,JavaScript会将整数转换为字符串进行比较。如果要避免类型转换的影响,应该使用"==="严格比较运算符来比较操作数的值和类型。

0
0 Comments

在JavaScript中, == ""的比较结果会返回true。为什么会出现这种情况呢?原因在于JavaScript是一种弱类型语言,它会根据操作和其他变量的类型进行隐式转换。

举个例子,当我们执行以下代码时:

alert ("5" - 1);  // 4  (int)
alert ("5" + 1);  // "51" (string) "+"也是一个连接字符串的操作符
alert ("5" == 5); // true

第一个alert语句中,"5"被隐式转换为数字类型,并且执行减法操作,所以结果为4。

第二个alert语句中,"5"和1被隐式转换为字符串类型,并且执行字符串连接操作,所以结果为"51"。

第三个alert语句中,"5"被隐式转换为数字类型,与5进行比较,由于它们的值相等,所以结果为true。

如果我们想要进行身份检查,即确保变量完全相同,而不仅仅是相等,我们可以使用===运算符,例如:

alert("5" == 5);  // true,它们相等
alert("5" === 5); // false,它们不完全相同

如果你想了解更多关于相等和身份比较运算符的区别,可以参考这个问题:How do the equality and identity comparison operators differ? PHP的实现与JavaScript非常相似。

总结起来,JavaScript中 == ""返回true的原因是其隐式转换的机制,当我们想要进行身份检查时,应该使用===运算符来确保变量的完全相同。

0