DEV Community

Cover image for JavaScript - == and ===
Lachelle Zhang
Lachelle Zhang

Posted on • Edited on

JavaScript - == and ===

1. ==

Equality(==) - MDN

The equality operator's camparison can be roughly summarized as follows:

  • If the operands are both objects, return true only if both operands reference the same object.
let a = { food: "pork", fruit: "watermelon" };
let b = a;
console.log(a == b); //true
let c = { ...a }; //or other object-copy operations
console.log(a == c); //false
Enter fullscreen mode Exit fullscreen mode
  • If one operand is null and the other is undefined, return true.
console.log(undefined == null); //true
console.log(null == undefined); //true
Enter fullscreen mode Exit fullscreen mode
  • If the operands have the same type, they are compared as follows:

    • String: return true only if both operands have the same characters in the same order.
    console.log("abcd" == "abcd"); //true
    console.log("abcd" == "abcde"); //false
    
    • Number: return true only if both operands have the same value. +0 and -0 are treated as the same value. If either operand is NaN, return false.
    console.log(1 == 1); //true
    console.log(1 == 2); //false
    console.log(+0 == -0); //true
    console.log(NaN == NaN); //false
    
    • Boolean: return true only if operands are both true or both false.
  • If the operands are of different types, try to convert them to the same type before comparing:

    • When comparing a number to a string, try to convert the string to a numeric value.
    console.log(1 == "1"); //true
    
    • If one of the operands is a boolean, convert the boolean operand to 1 if it is true and 0 if it is false.
    console.log(true == 1); //true
    console.log(false == 0); //true
    console.log(0 == !!null); // true. !null is true, !true is false, false is 0
    console.log(0 == !!undefined); // true. !undefined is true, !true is false, false is 0
    
    • If one of the operands is an object and the other is a number or a string, try to convert the object to a primitive using the object's valueOf() and toString() methods.
    • Object.prototype.valueOf(): Returns the primitive value of the specified object(objects of type string, number, bigint, boolean, symbol). If the object has no primitive value(objects of type object), it returns the object itself.
      // objects of type string, number, bigint, boolean, symbol
      let a = 1;
      console.log(a.valueOf()); // 1
      // objects of type object
      let b = { name: "Kitty" };
      console.log(b.valueOf()); // { name: 'Kitty' }
    
    • Object.prototype.toString(): Returns a string representing the object(objects of type string, number, bigint, boolean, symbol). If the object has no primitive value(objects of type object), it returns [object Type].
      // objects of type string, number, bigint, boolean, symbol
      let a = 1;
      console.log(a.toString()); // "1"
      // objects of type object
      let b = { name: "Kitty" };
      console.log(b.toString()); // [object Object]
    
    • Array.prototype.toString(): Array object overrides Object's method toString(). It returns a string representing the elements of the array.
      let arr = ["kitty"];
      console.log(arr.toString()); // 'kitty'
    
// object == string
let obj = { name: "kitty" };
console.log(obj == "kitty"); //false. obj.valueOf(): { name: "kitty" }, obj.toString(): [object Object]
// array == string
let arr = ["kitty"];
console.log(arr == "kitty"); //true. arr.valueOf(): ['kitty'], arr.toString(): 'kitty'
Enter fullscreen mode Exit fullscreen mode

2. ===

Strict equality(===) - MDN

Unlike the equality operator, the strict equality operator always considers operands of different types to be different.

  • If the operands are of different types, return false.
consol.log("3" === 3); //false
console.log(true === 1); //false
console.log(null === undefined); //false
Enter fullscreen mode Exit fullscreen mode
  • If both operands are objects, return true only if they refer to the same object.
let obj1 = { name: "kitty", age: 1 };
let obj2 = obj1;
console.log(obj1 === obj2);
let obj3 = { name: "kitty", age: 1 };
console.log(obj1 === obj3);
let obj4 = { ...obj1 };
console.log(obj1 === obj4);
Enter fullscreen mode Exit fullscreen mode
  • If both operands are null or both operands are undefined, return true.
console.log(null === null); // true
console.log(undefined === undefined); // true
Enter fullscreen mode Exit fullscreen mode
  • If either operand is NaN, return false.
console.log(NaN === NaN); // false
Enter fullscreen mode Exit fullscreen mode
  • Otherwise, compare the two operand's values:

    • Numbers must have the same numeric values. +0 and -0 are considered to be the same value.
    console.log(+0 === -0); //true
    console.log(1 === 1); //true
    console.log(0 === 1); //false
    
    • Strings must have the same characters in the same order.
    console.log("kitty" === "kitty"); //true
    console.log("kitty" === "kity"); //false
    
    • Booleans must be both true or both false.

The most notable difference between == and === is that if the operands are of different types, the == operator attempts to convert them to the same type before comparing.

Top comments (0)