loading...

Sometimes JavaScript arrays don't compare

bugmagnet profile image Bruce Axtens ・1 min read

JavaScript Madness (5 Part Series)

1) Extending the Array class to calculate the Fibonacci sequence 2) Javascript madness - perfect square 3) Too clever for your own good? 4) Sometimes JavaScript arrays don't compare 5) toTimeString(), a JavaScript function to make sense of millisecond values

I must admit, I was expecting this to work

const arr = [];
arr.push(true);
arr.push(true);
arr.push(true);
if (arr === [true, true, true]) { ...

but it doesn't, at least not in Microsoft JScript (ES3). Hmm, let's try Deno. Nope, doesn't work in Deno (V8) either.

Obviously, I missed something when learning JavaScript.

So I'm going with

if (arr.join() === [true, true, true].join()) { ...

Not brilliant, but it'll do the job.

Discussion

markdown guide
 

Your example works because {c:1,d:2} etc gets turned in to "[object Object]".

 

Well said! This is the danger in things that "appear" to work, but have subtle bugs.

For me just borrow someone else's deep compare (which will be faster as the moment it finds a difference it will exit). Lodash/Underscore has a deep compare, Sugar has one too.

The shortest naive way to do this is JSON.stringify both operands. But let's imagine that the two arrays are 50Mb long and differ on the first character - that would be an awfully slow process and a lot of memory thrashing.