Den Isahac
Den Isahac

Reputation: 1525

Javascript weird comparison result

I have two strings declared in Javascript as follows:

var str1 = new String('Hello');
var str2 = 'Hello';

Comparison results:

str1 == str2 // true
str1 === str2 // false

My questions is, why is === yields to false when both strings are equal in value and have the same string type?

Upvotes: 0

Views: 395

Answers (3)

crellee
crellee

Reputation: 915

A string object is not a primitive string and therefore will not be equal completely by using ===. Instead, if you insist on using === you can use the valueOf function, like:

new String("hello").valueOf() === str2

Upvotes: 0

Denys Séguret
Denys Séguret

Reputation: 382092

You're comparing a String object with a primitive string. Those are two different types.

To make it clearer, here are all JS types:

  • Six data types that are primitives:
    • Boolean
    • Null
    • Undefined
    • Number
    • String
    • Symbol (new in ECMAScript 6)
  • and Object

When compared using ===, an object is only equal to itself (and thus not to a primitive value nor to another identical object)

When comparing using ==, EcmaScript follows this procedure, which calls the toString method on the String object.

There's normally no reason to explicitly use String objects (you implicitly use them every time your code needs an object and you pass a string, but the JS engine handles the promotion for you). You should almost always stick to primitive strings.

Upvotes: 3

Nurbol Alpysbayev
Nurbol Alpysbayev

Reputation: 21851

Because

typeof new String('Hello') === 'object'

and

typeof 'Hello' === 'string'

The former is an object, the latter is a primitive.

The == check works because the String object has also toString method and JS invokes that method in this case (as well as when concatenating with other string).

Upvotes: 2

Related Questions