Skip to content

Instantly share code, notes, and snippets.

@gaearon
Last active April 18, 2024 14:49
Show Gist options
  • Save gaearon/08a85a33e3d08f3f2ca25fb17bd9d638 to your computer and use it in GitHub Desktop.
Save gaearon/08a85a33e3d08f3f2ca25fb17bd9d638 to your computer and use it in GitHub Desktop.
strictEquals.js
// Your scientists were so preoccupied
// with whether or not they could,
// they didn't stop to think if they should.
// Like a === b
function strictEquals(a, b) {
if (Object.is(a, b)) {
// Same value.
// Is this NaN?
if (Object.is(a, NaN)) { // We already know a and b are the same, so it's enough to check a.
// Special case #1.
return false;
} else {
// They are equal!
return true;
}
} else {
// Different value.
// Are these 0 and -0?
if (
(Object.is(a, 0) && Object.is(b, -0)) ||
(Object.is(a, -0) && Object.is(b, 0))
) {
// Special case #2.
return true;
} else {
// They are not equal!
return false;
}
}
}
@Sergio401
Copy link

const strictEqual = (a, b) => {
 if(Number.isNaN(a) && Number.isNaN(b)){
   return false
 } 
 else if(Object.is(a, -0) && Object.is(b, 0)) {
   return true
 }
 else if(Object.is(a, 0) && Object.is(b, -0)) {
   return true
 } 
 else {
   return Object.is(a, b)
 }
}

@furkotikoo
Copy link

am I missing something?

function strictEquals(a,b) {
    // consider below 2 special cases
    // -0, 0
    // NaN NaN
    if (Object.is(a, NaN) && Object.is(b, NaN)) return false;
    if (Object.is(a, 0) && Object.is(b, -0)) return true;

 return Object.is(a, b);
}

you are not holding the case
if (Object.is(a, -0) && Object.is(b, 0)) return true;

@joasegovia9427
Copy link

Hi, here is my solution::

const myInfinite = 1/0; // = Infinite
const myCero = 0/myInfinite; // = 0

function stringEquals(a: Number, b: Number){
  if(Number.isNaN(a) && Number.isNaN(b))
    return false;

  if(Object.is(a, myCero) && Object.is(b, -myCero))
    return true

  if(Object.is(a, -myCero) && Object.is(b, myCero))
    return true
  
  return Object.is(a, b);
}

let a, b;

a=1;
b=1;
stringEquals(a,b);
console.log(a===b);
console.log(Object.is(a,b));

a=1;
b=2;
stringEquals(a,b);
console.log(a===b);
console.log(Object.is(a,b));

a=0;
b=0;
stringEquals(a,b);
console.log(a===b);
console.log(Object.is(a,b));

a=NaN;
b=NaN;
stringEquals(a,b);
console.log(a===b);
console.log("It must be different:: ",Object.is(a,b));

a=0;
b=-0;
stringEquals(a,b);
console.log(a===b);
console.log("It must be different:: ",Object.is(a,b));

a=-0;
b=0;
stringEquals(a,b);
console.log(a===b);
console.log("It must be different:: ",Object.is(a,b));

Screenshot 2023-05-01 at 22 13 50 (2)

@drfrostongithub
Copy link

drfrostongithub commented May 23, 2023

My Function is like this

function strictEquals(a,b) {
if (
  (Object.is(a, 0) && Object.is(b, -0)) ||
  (Object.is(a, -0) && Object.is(b, 0))
) {
  return true;
}
if (Number.isNaN(a) && Number.isNaN(b)){
  return false;
}
  return Object.is(a,b)
}

console.log(strictEquals(NaN,NaN));

Many already made it.

@betomadrazo
Copy link

betomadrazo commented Jun 3, 2023

My version:

function strictEquals(a, b) {
    if (Number.isNaN(a) && Number.isNaN(b)) return !Object.is(a, b);
    if ((Object.is(a, -0) ^ Object.is(b, -0)) && (Object.is(a, 0) ^ Object.is(b, 0))) return !Object.is(a, b);
  return Object.is(a, b);
}

@sergiosrtd
Copy link

Hope this is the shortest

function strictEquals(a,b){
  if(Number.isNaN(a) && Number.isNaN(b)) return false
  if(!Object.is(a,b) && Object.is(a+"",b+"")) return true
  return Object.is(a,b)
}

@marnauortega
Copy link

function stringEquals(a, b) {
    if (isNaN(a)) return false
    if ([0, -0].includes(a) && Object.is(a, -b)) return true
    return Object.is(a, b)
}

First special case NaN === NaN => both a and b will be NaN and therefore, and if either value is NaN, should return false. Other case, return the result of Objects.is(a, b)

Second sepecial case 0 === -0 or -0 === 0 => if the a is 0 or -0 and Object.is(a -b), its one of the special situations, that needs to return true. Otherwise, return Object.is(a, b)

I found it interesting that you managed to shorten if (isNaN(a) && isNaN(b)) return false to if (isNaN(a)) return false. You don't need to check if either value is NaN, you have enough with checking if the first value is NaN, in which case it will definitely evaluate to false. And you don't need to care about the remaining case in which b is NaN while a isn't, because Object.is() will handle it perfectly.

@Yinboan
Copy link

Yinboan commented Aug 30, 2023

 function strictEquals(a,b){
     if(typeof a === 'number' && typeof b === 'number'){
         return a == b   
     }
     return Object.is(a,b)
 }

@spcbfr
Copy link

spcbfr commented Sep 27, 2023

I couldn't figure it out on my own so I looked at your version and tried to minimize (not simplify!) it to the best of my ability

const strictEquals = (a,b) => (Object.is(a,b) 
     ? !Object.is(a, NaN) 
     : (Object.is(a, 0) && Object.is(b, -0)) || (Object.is(a, -0) && Object.is(b, 0)))
}

@mhmdsalahsebai
Copy link

function strictEquals(a, b) {
    if(Object.is(a, NaN) && Object.is(b, NaN)) return false;
    if(Object.is(a, -0) && Object.is(b, 0)) return true;
    if(Object.is(b, -0) && Object.is(a, 0)) return true;
    return Object.is(a, b);
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment