59

I started with:

"1:2".split(':') == ["1","2"]; 
// false

Then tried:

[1,2] == [1,2];
// false

and ultimately:

[] == []; 
// false

I've since found that:

"1:2".split(':').toString() == [1,2].toString();
// true

So I've solved my initial issue (kind of) but why can't arrays match each other?

4
  • 4
    Neither ==, nor === do element wise comparison. They both check if both the arrays are one and the same. Commented Jun 13, 2015 at 15:57
  • 2
    This is because arrays are objects in JavaScript. You might want to have a look at this stackoverflow.com/questions/22395357/… Commented Jun 13, 2015 at 15:58
  • 1
    possible duplicate of Why isn't [1,2,3] equal to itself in Javascript? Commented May 4, 2018 at 16:22
  • Note if you just want to check for an empty array you can check if array.length === 0 Commented Sep 6, 2021 at 18:44

6 Answers 6

62

Javascript arrays are objects and you can't simply use the equality operator == to understand if the content of those objects is the same. The equality operator will only test if two object are actually exactly the same instance (e.g. myObjVariable==myObjVariable, works for null and undefined too).

If you need to check if two array are equals i'd recommend to just traverse both arrays and verify that all the elements have the same value (and that the two array have the same length).

Regarding custom objects equality i'd build instead a specific equals function and i'd add it to the prototype of your class.

Considering that in the end you converted both arrays to a String and tested equality of the resulting strings, you could one day consider using a similar but more generic technique you'll find described in more than a few places:

JSON.stringify(OBJ1) === JSON.stringify(OBJ2) 

Well, don't.

While this could work if the order of the properties will always the same for those object instances, this leaves the door open for extremely nasty bugs that could be hard to track down. Always favor a more explicit approach and just write a clean and readable function that will test for equality checking all the required fields.

Sign up to request clarification or add additional context in comments.

2 Comments

Interesting note, myObjVariable == myObjectVariable is true in all instances of JS except where myObjVariable = NaN... :)
there's many interesting notes about NaN, one of the most famous being NaN.constructor === Number.
15

The == operator for Objects in Javascript only checks to see if the objects are the same actual object reference, not if they are two separate object that contain the same contents. There is no built in operator for checking if they contain the same contents. You would have to write a function to do that sort of comparison yourself.

Your string conversion is one way of comparing two arrays as long as the array elements only contain primitive values (not other objects). If the array elements could contain other elements, then you would have to make sure those objects were themselves converted into representative strings too.

And, converting to a string would not discern between an array element that contains "4" versus one that contains 4 since both convert to "4" in the string representation.


FYI, you can read in this answer about records and tuples, two new data types coming to future Javascript that will allow comparing an immutable version of arrays and objects by value instead of by only comparing to see if they are the same object.

Comments

5

Equality for objects will tell you if the two objects are the same one.

var a = [];
var b = a;
a === b;    // True, a and b refer to the same object
[] === [];  // False, two separate objects

You will have to loop through the arrays to see if they have the same elements.

See: How to check if two arrays are equal with JavaScript?

Comments

2

In javascript each [] is an instance of window.Array class. So you are basically trying to compare two different objects. Since array's can have any no. and any type of elements including Objects and Custom Objects and those nested arrays can again have numerous properties and arrays and so on.

It becomes ambiguous when it comes to comparison, you will never be sure what do you want to do with those objects and nested properties. So what you are trying to achieve by comparing can be done in so many other ways. You just have to figure out the right way for your case.

Comments

1

One way is to make your own Array checking function:

How to compare arrays in JavaScript?!

Another way is to convert the Array to a String with .join(), and compare the strings. Then convert them back into Arrays with .split().

Comments

-2

If I relate this problem with that in Python:

Input:

a="1 2 3 4"

case I:

a=input.split(' ')

output: ['1', '2', '3', '4']

case II:

a=map(int,input.split(' '))

output: [1, 2, 3, 4]

So, the fault is that of type, as it could come-out aa 'true' for:

"1:2".split(':').toString() == [1,2].toString(); //true

1 Comment

Please share more details. As this question is about Javascript, how does your answer relate to this?

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.