Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In Javascript, <int-value> == "<int-value>" evaluates to true. Why is it so?

If I do 0 == "0" it evaluates to true. Try,

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

alert happens.

And, it's also noticeable that true == "true" doesn't evaluate to true. Try,

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

alert doesn't happen.

Why is it so?

like image 401
Real Red. Avatar asked Mar 20 '09 03:03

Real Red.


People also ask

Why == is false in JavaScript?

Because == (and === ) test to see if two objects are the same object and not if they are identical objects.

Why do we use == in JavaScript?

The equality operator ( == ) checks whether its two operands are equal, returning a Boolean result. Unlike the strict equality operator, it attempts to convert and compare operands that are of different types.

What is the difference between === and == when comparing two values in JavaScript?

The main difference between the == and === operator in javascript is that the == operator does the type conversion of the operands before comparison, whereas the === operator compares the values as well as the data types of the operands.

Should you ever use == in JavaScript?

Short answer: never. This post looks at five possible exemptions from the rule to always use === and explains why they aren't. JavaScript has two operators for determining whether two values are equal [1]: The strict equality operator === only considers values equal that have the same type.


2 Answers

The behavior of == is a bit lengthy, but clearly defined in the ecma-262 spec:

11.9.3 The Abstract Equality Comparison Algorithm

The comparison x == y, where x and y are values, produces true or false. Such a comparison is performed as follows:

  1. If Type(x) is different from Type(y), go to step 14.
  2. If Type(x) is Undefined, return true.
  3. If Type(x) is Null, return true.
  4. If Type(x) is not Number, go to step 11.
  5. If x is NaN, return false.
  6. If y is NaN, return false.
  7. If x is the same number value as y, return true.
  8. If x is +0 and y is −0, return true.
  9. If x is −0 and y is +0, return true.
  10. Return false.
  11. If Type(x) is String, then return true if x and y are exactly the same sequence of characters (same length and same characters in corresponding positions). Otherwise, return false.
  12. If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return false.
  13. Return true if x and y refer to the same object or if they refer to objects joined to each other (see 13.1.2). Otherwise, return false.
  14. If x is null and y is undefined, return true.
  15. If x is undefined and y is null, return true.
  16. If Type(x) is Number and Type(y) is String, return the result of the comparison x == ToNumber(y).
  17. If Type(x) is String and Type(y) is Number, return the result of the comparison ToNumber(x) == y.
  18. If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
  19. If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
  20. If Type(x) is either String or Number and Type(y) is Object, return the result of the comparison x == ToPrimitive(y).
  21. If Type(x) is Object and Type(y) is either String or Number, return the result of the comparison ToPrimitive(x) == y.
  22. Return false.

Step 16 applies to your former example:

   0 == "0"            // apply 16
≡  0 == toNumber("0")
≡  0 == 0              // apply 7
≡  true

And step 18, then step 16, apply to the latter:

   true == "true"            // apply 18
≡  toNumber(true) == "true"
≡  1 == "true"               // apply 16
≡  1 == toNumber("true")
≡  1 == NaN                  // apply 6
≡  false
like image 123
Andrey Fedorov Avatar answered Oct 04 '22 02:10

Andrey Fedorov


Doing this:

if(5 == "5")

Makes javascript convert the first 5 to a string. Try this:

if(5 === "5")

The === makes Javascript evaluate type as well.

This is actually a duplicate of this question where it is explained very well.

like image 24
Paolo Bergantino Avatar answered Oct 04 '22 04:10

Paolo Bergantino