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?
Because == (and === ) test to see if two objects are the same object and not if they are identical objects.
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.
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.
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.
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:
- If Type(x) is different from Type(y), go to step 14.
- If Type(x) is Undefined, return true.
- If Type(x) is Null, return true.
- If Type(x) is not Number, go to step 11.
- If x is NaN, return false.
- If y is NaN, return false.
- If x is the same number value as y, return true.
- If x is +0 and y is −0, return true.
- If x is −0 and y is +0, return true.
- Return false.
- 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.
- If Type(x) is Boolean, return true if x and y are both true or both false. Otherwise, return false.
- 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.
- If x is null and y is undefined, return true.
- If x is undefined and y is null, return true.
- If Type(x) is Number and Type(y) is String, return the result of the comparison x == ToNumber(y).
- If Type(x) is String and Type(y) is Number, return the result of the comparison ToNumber(x) == y.
- If Type(x) is Boolean, return the result of the comparison ToNumber(x) == y.
- If Type(y) is Boolean, return the result of the comparison x == ToNumber(y).
- If Type(x) is either String or Number and Type(y) is Object, return the result of the comparison x == ToPrimitive(y).
- If Type(x) is Object and Type(y) is either String or Number, return the result of the comparison ToPrimitive(x) == y.
- 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
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With