This is not new.
Equivalency of non-primitives (i.e. objects) compares whether they are literally the same actual object. This is not a new concept. Works the same for other non-primitive stuff in JS:
var a = [1,2,3];
var b = [1,2,3];
console.log(a == b); // -> false
var c = {foo:'bar'};
var d = {foo:'bar'};
console.log(c == d); // -> false
Why do primitives/objects compare differently?
Simple: because the concept of whether 2 primitives are the "same" is different from the concept of whether 2 objects are the "same".
You actually can make multiple references to the same object, therefore checking whether 2 references are "the same" takes on a meaning very different from primitives. They literally might be actual pointers to the same object:
var str1 = 'foo';
var str2 = str1;
str2 += ' bar';
console.log(str2); // -> "foo bar"
console.log(str1); // -> still just "foo"
// str1 is unchanged, primitives don't do pointers
var obj1 = {val:'foo'};
var obj2 = obj1;
obj2.val += ' bar';
console.log(obj2.val); // -> "foo bar"
console.log(obj1.val); // -> "foo bar"
// obj1 and obj2 are LITERALLY pointers to the same thing
// changing one changes the other
So it makes sense that with primitives (where one entire point of their existence is that the values are primitive enough that we can compare them even while they are not actually pointing to the same actual 1's and 0's internally) might act different from non-primitives (where 2 values may literally point to the same 1's and 0's internally) when we ask the question "are they equivalent"?
Not to mention the technical difficulties.
Primitives are called such for a reason: they are simple/primitive values. They are easy to compare because of that.
Objects are much more complex by design. They can even hold references to other objects...and even to themselves. Comparing them the way you imply should be done would be a possibly infinite iterative process rather than a simple operator action. Consider this:
var a = {foo:'bar'};
a.a = a;
console.log(a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.a.foo); // -> bar
// could go on forever that way
Making something like checking equivalency suddenly mean iterative processes that are possibly infinite would profoundly and negatively impact a language. It makes far more sense that they just check whether they are literally equal (i.e. point to the same exact object).